From e08aa0a667aff3c707c213a50b4f4ab8a78bc433 Mon Sep 17 00:00:00 2001 From: anon28410 Date: Sat, 18 Jul 2026 16:54:26 +0100 Subject: [PATCH] Restart repository history from target event --- .gitignore | 43 + README.md | 36 + app/api/analyze/route.ts | 193 + app/api/audio/route.ts | 110 + app/api/batch-rename/route.ts | 50 + app/api/check/mqa/route.ts | 61 + app/api/check/upconv/route.ts | 89 + app/api/copy/route.ts | 52 + app/api/cover/route.ts | 43 + app/api/delete/route.ts | 45 + app/api/propose-rename/route.ts | 84 + app/api/qbittorrent/inject/route.ts | 60 + app/api/qbittorrent/resume/route.ts | 26 + app/api/qbittorrent/status/route.ts | 28 + app/api/red-template/route.ts | 222 + app/api/sanitize/route.ts | 54 + app/api/scan/route.ts | 49 + app/api/spectrogram/route.ts | 126 + app/api/system/check-tools/route.ts | 7 + app/api/tidal/search/route.ts | 286 + app/api/torrent/route.ts | 90 + app/api/upload/image/route.ts | 48 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 144 + app/layout.tsx | 36 + app/page.tsx | 5 + components.json | 22 + components/album-selector.tsx | 56 + components/album-view.tsx | 2344 ++++++++ components/dashboard.tsx | 312 + components/rename-dialog.tsx | 161 + components/status-log.tsx | 46 + components/tidal-search.tsx | 388 ++ components/tool-checker.tsx | 169 + components/ui/alert.tsx | 66 + components/ui/audio-wave.tsx | 63 + components/ui/badge.tsx | 46 + components/ui/button.tsx | 60 + components/ui/card.tsx | 92 + components/ui/dialog.tsx | 122 + components/ui/input.tsx | 21 + components/ui/scroll-area.tsx | 58 + components/ui/select.tsx | 187 + components/ui/separator.tsx | 28 + components/ui/skeleton.tsx | 13 + components/ui/tabs.tsx | 55 + eslint.config.mjs | 18 + example.json | 91 + lib/qbittorrent.ts | 98 + lib/tool-check.ts | 96 + lib/utils.ts | 6 + lib/utils/audio.ts | 117 + lib/utils/file-ops.ts | 37 + lib/utils/paths.ts | 55 + lib/utils/sanitize.ts | 29 + lib/utils/verify-red-fixes.ts | 59 + next.config.ts | 8 + package-lock.json | 8345 +++++++++++++++++++++++++++ package.json | 51 + postcss.config.mjs | 7 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/sfx/error.mp3 | Bin 0 -> 129024 bytes public/sfx/stage-complete.mp3 | Bin 0 -> 46811 bytes public/sfx/success.mp3 | Bin 0 -> 82176 bytes public/vercel.svg | 1 + public/window.svg | 1 + tsconfig.json | 34 + types/index.ts | 258 + userscript.js | 353 ++ 71 files changed, 15963 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/api/analyze/route.ts create mode 100644 app/api/audio/route.ts create mode 100644 app/api/batch-rename/route.ts create mode 100644 app/api/check/mqa/route.ts create mode 100644 app/api/check/upconv/route.ts create mode 100644 app/api/copy/route.ts create mode 100644 app/api/cover/route.ts create mode 100644 app/api/delete/route.ts create mode 100644 app/api/propose-rename/route.ts create mode 100644 app/api/qbittorrent/inject/route.ts create mode 100644 app/api/qbittorrent/resume/route.ts create mode 100644 app/api/qbittorrent/status/route.ts create mode 100644 app/api/red-template/route.ts create mode 100644 app/api/sanitize/route.ts create mode 100644 app/api/scan/route.ts create mode 100644 app/api/spectrogram/route.ts create mode 100644 app/api/system/check-tools/route.ts create mode 100644 app/api/tidal/search/route.ts create mode 100644 app/api/torrent/route.ts create mode 100644 app/api/upload/image/route.ts create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 components.json create mode 100644 components/album-selector.tsx create mode 100644 components/album-view.tsx create mode 100644 components/dashboard.tsx create mode 100644 components/rename-dialog.tsx create mode 100644 components/status-log.tsx create mode 100644 components/tidal-search.tsx create mode 100644 components/tool-checker.tsx create mode 100644 components/ui/alert.tsx create mode 100644 components/ui/audio-wave.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/scroll-area.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/separator.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 eslint.config.mjs create mode 100644 example.json create mode 100644 lib/qbittorrent.ts create mode 100644 lib/tool-check.ts create mode 100644 lib/utils.ts create mode 100644 lib/utils/audio.ts create mode 100644 lib/utils/file-ops.ts create mode 100644 lib/utils/paths.ts create mode 100644 lib/utils/sanitize.ts create mode 100644 lib/utils/verify-red-fixes.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/sfx/error.mp3 create mode 100644 public/sfx/stage-complete.mp3 create mode 100644 public/sfx/success.mp3 create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 tsconfig.json create mode 100644 types/index.ts create mode 100644 userscript.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4488e3c --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +/spectrograms diff --git a/README.md b/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/api/analyze/route.ts b/app/api/analyze/route.ts new file mode 100644 index 0000000..4982436 --- /dev/null +++ b/app/api/analyze/route.ts @@ -0,0 +1,193 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { execFile } from 'child_process'; +import util from 'util'; +import { getFlacMetadata, parseLabel } from '@/lib/utils/audio'; +import { AnalysisTrack, AnalysisResponse } from '@/types'; + +const execFileAsync = util.promisify(execFile); + +// This route analyzes the album: extracts metadata and checks quality +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const files = await fs.readdir(albumPath); + const flacFiles = files.filter((file) => file.toLowerCase().endsWith('.flac')); + + if (flacFiles.length === 0) { + return NextResponse.json({ error: 'No FLAC files found' }, { status: 400 }); + } + + const tracks: (AnalysisTrack & { size?: number })[] = await Promise.all( + flacFiles.map(async (file) => { + const filePath = path.join(albumPath, file); + try { + // Check for audio corruption + try { + await execFileAsync('ffmpeg', ['-v', 'error', '-i', filePath, '-f', 'null', '-']); + } catch (ffmpegError) { + return { + filename: file, + path: filePath, + error: 'Corrupted audio data or length metadata mismatch', + }; + } + + const stats = await fs.stat(filePath); + const metadata = await getFlacMetadata(filePath); + return { + filename: file, + path: filePath, + ...metadata, + fullPathLength: filePath.length, + size: stats.size, + }; + } catch (e) { + return { + filename: file, + path: filePath, + error: 'Failed to parse metadata', + }; + } + }) + ); + + // Calculate total size + const totalSize = tracks.reduce((acc, track) => acc + (track.size || 0), 0); + + // Sort tracks by track number if available, else by filename + tracks.sort((a, b) => { + if ('error' in a || 'error' in b) return 0; // Keep order if error + const trackA = a.common?.track?.no ?? 0; + const trackB = b.common?.track?.no ?? 0; + if (trackA && trackB) return trackA - trackB; + return a.filename.localeCompare(b.filename); + }); + + // Analyze quality + let isLossless = true; + let isHiRes = true; + let mixed = false; + let qualityDetails = ''; + + const sampleRates = new Set(); + const bitDepths = new Set(); + + tracks.forEach((track) => { + if ('error' in track) return; + const sr = track.format?.sampleRate; + const bd = track.format?.bitsPerSample; + + if (sr) sampleRates.add(sr); + if (bd) bitDepths.add(bd); + + if (sr !== 44100 || bd !== 16) { + isLossless = false; // Not strictly CD quality + } + if (!sr || sr < 48000 || !bd || bd < 24) { + isHiRes = false; // Not strictly Hi-Res + } + }); + + if (sampleRates.size > 1 || bitDepths.size > 1) { + mixed = true; + qualityDetails = `NOTE: Mixed formats. Sample Rates: ${Array.from(sampleRates).join(', ')} Hz. Bit Depths: ${Array.from(bitDepths).join(', ')} bit.`; + + // Generate detailed message for mixed content + const mixedDetails = tracks.map(t => { + if ('error' in t) return `${t.filename}: Error`; + return `Track ${t.common?.track?.no || '?'}: ${t.format?.bitsPerSample}bit / ${t.format?.sampleRate}Hz`; + }).join('\n'); + + qualityDetails += '\n' + mixedDetails; + } + + // Determine overall status + let status = 'UNKNOWN'; + if (tracks.some(t => 'error' in t)) { + status = 'CORRUPT'; + } else if (mixed) { + status = 'MIXED'; + } else if (isHiRes) { + status = 'HI-RES'; // 24bit LOSSLESS + } else if (sampleRates.has(44100) && bitDepths.has(16) && sampleRates.size === 1 && bitDepths.size === 1) { + status = 'LOSSLESS'; + } else { + // Could be 48/16 or something else + status = `OTHER (${Array.from(bitDepths)[0]}bit / ${Array.from(sampleRates)[0]}Hz)`; + } + + // Extract Album Metadata (from first track) + const firstValidTrack = tracks.find((t): t is Extract => !('error' in t)); + + let label = parseLabel(firstValidTrack?.common?.copyright || 'Unknown Label'); + if (!label) label = 'Unknown Label'; // Fallback if parsing resulted in empty string (e.g. Records DK) + + // Additional artists: filter out album artist from artists list + const albumArtist = firstValidTrack?.common?.albumartist || firstValidTrack?.common?.artist || ''; + // Collect artists from ALL tracks, not just the first one + const allArtistsSet = new Set(); + tracks.forEach(t => { + if ('error' in t) return; + const trackArtists = t.common?.artists || []; + trackArtists.forEach(artist => { + // Split by common delimiters to handle combined strings like "A, B & C" + const parts = artist.split(/,\s+|&|\s+\/\s+/).map(a => a.trim()).filter(a => a.length > 0); + parts.forEach(p => allArtistsSet.add(p)); + }); + }); + const allArtists = Array.from(allArtistsSet); + + // Identify all main artists (Album Artist + Track Artist) individually + const mainArtistNames = new Set( + [albumArtist, firstValidTrack?.common?.artist || ''] + .flatMap(name => name.split(/,\s+|&|\s+\/\s+/)) // Split by comma, &, / + .map(a => a.trim()) + .filter(a => a.length > 0) + ); + + const additionalArtists = allArtists.filter(a => !mainArtistNames.has(a)); + + const albumMetadata = { + artist: firstValidTrack?.common?.artist || 'Unknown Artist', + album: firstValidTrack?.common?.album || 'Unknown Album', + year: firstValidTrack?.common?.year || (firstValidTrack?.common?.date ? parseInt(firstValidTrack.common.date.split('-')[0]) : undefined), + upc: firstValidTrack?.common?.barcode, + label: label, + tidalUrl: firstValidTrack?.native?.tidalUrl, + additionalArtists: additionalArtists.length > 0 ? additionalArtists : undefined, + releaseType: (() => { + const name = firstValidTrack?.common?.album?.toLowerCase() || ''; + if (name.includes('live')) return 11; // Live album + if (name.includes('soundtrack') || name.includes('ost')) return 3; // Soundtrack + + const validTracks = tracks.filter((t) => !('error' in t)).length; + if (validTracks === 1) return 9; // Single + if (validTracks <= 5) return 5; // EP + + return 1; // Album + })(), + totalSize + }; + + return NextResponse.json({ + albumPath, + metadata: albumMetadata, + tracks, + quality: { + status, + mixed, + details: qualityDetails, + }, + }); + } catch (error) { + console.error('Error analyzing album:', error); + return NextResponse.json({ error: 'Failed to analyze album' }, { status: 500 }); + } +} diff --git a/app/api/audio/route.ts b/app/api/audio/route.ts new file mode 100644 index 0000000..9b3bd6f --- /dev/null +++ b/app/api/audio/route.ts @@ -0,0 +1,110 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import mime from 'mime'; + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const filePath = searchParams.get('path'); + + if (!filePath) { + return NextResponse.json({ error: 'Path is required' }, { status: 400 }); + } + + try { + if (!await fs.pathExists(filePath)) { + return NextResponse.json({ error: 'File not found' }, { status: 404 }); + } + + const stat = await fs.stat(filePath); + if (!stat.isFile()) { + return NextResponse.json({ error: 'Not a file' }, { status: 400 }); + } + + const fileSize = stat.size; + const range = request.headers.get('range'); + const contentType = mime.getType(filePath) || 'application/octet-stream'; + + if (range) { + const parts = range.replace(/bytes=/, "").split("-"); + const start = parseInt(parts[0], 10); + const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1; + const chunksize = (end - start) + 1; + const file = fs.createReadStream(filePath, { start, end }); + + // Convert stream to ReadableStream for NextResponse + const stream = new ReadableStream({ + start(controller) { + file.on('data', (chunk) => { + try { + controller.enqueue(chunk); + } catch (e) { + // Controller likely closed, stop reading + file.destroy(); + } + }); + file.on('end', () => { + try { + controller.close(); + } catch (e) { } + }); + file.on('error', (err) => { + try { + controller.error(err); + } catch (e) { } + }); + }, + cancel() { + file.destroy(); + } + }); + + return new NextResponse(stream, { + status: 206, + headers: { + 'Content-Range': `bytes ${start}-${end}/${fileSize}`, + 'Accept-Ranges': 'bytes', + 'Content-Length': chunksize.toString(), + 'Content-Type': contentType, + }, + }); + } else { + const file = fs.createReadStream(filePath); + + // Convert stream to ReadableStream for NextResponse + const stream = new ReadableStream({ + start(controller) { + file.on('data', (chunk) => { + try { + controller.enqueue(chunk); + } catch (e) { + file.destroy(); + } + }); + file.on('end', () => { + try { + controller.close(); + } catch (e) { } + }); + file.on('error', (err) => { + try { + controller.error(err); + } catch (e) { } + }); + }, + cancel() { + file.destroy(); + } + }); + + return new NextResponse(stream, { + headers: { + 'Content-Length': fileSize.toString(), + 'Content-Type': contentType, + }, + }); + } + } catch (error) { + console.error('Error serving audio file:', error); + return NextResponse.json({ error: 'Failed to serve file' }, { status: 500 }); + } +} diff --git a/app/api/batch-rename/route.ts b/app/api/batch-rename/route.ts new file mode 100644 index 0000000..8a54dd3 --- /dev/null +++ b/app/api/batch-rename/route.ts @@ -0,0 +1,50 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { BatchRenameResponse, RenameOperation, RenameResult } from '@/types'; + +export async function POST(request: Request) { + try { + const { albumPath, renames } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + if (!renames || !Array.isArray(renames)) { + return NextResponse.json({ error: 'Invalid renames list' }, { status: 400 }); + } + + const results: RenameResult[] = []; + const errors: string[] = []; + + for (const { original, newName } of renames as RenameOperation[]) { + try { + const oldPath = path.join(albumPath, original); + const newPath = path.join(albumPath, newName); + + if (await fs.pathExists(oldPath)) { + await fs.rename(oldPath, newPath); + results.push({ original, newName, success: true }); + } else { + errors.push(`File not found: ${original}`); + } + } catch (e) { + const errorMessage = e instanceof Error ? e.message : String(e); + errors.push(`Failed to rename ${original}: ${errorMessage}`); + } + } + + const response: BatchRenameResponse = { + success: errors.length === 0, + results, + errors: errors.length > 0 ? errors : undefined + }; + + return NextResponse.json(response); + + } catch (error) { + console.error('Error executing renames:', error); + return NextResponse.json({ error: 'Failed to execute renames' }, { status: 500 }); + } +} diff --git a/app/api/check/mqa/route.ts b/app/api/check/mqa/route.ts new file mode 100644 index 0000000..f13f41e --- /dev/null +++ b/app/api/check/mqa/route.ts @@ -0,0 +1,61 @@ +import { NextResponse } from 'next/server'; +import { exec } from 'child_process'; +import util from 'util'; +import fs from 'fs-extra'; +import path from 'path'; +import { CheckMQAResponse } from '@/types'; + +const execPromise = util.promisify(exec); + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + // Find all FLAC files + const files = await fs.readdir(albumPath); + const flacFiles = files.filter(f => f.toLowerCase().endsWith('.flac')); + + if (flacFiles.length === 0) { + return NextResponse.json({ error: 'No FLAC files found' }, { status: 400 }); + } + + let mqaDetected = false; + let outputLog = ""; + + // Check all files + for (const file of flacFiles) { + const filePath = path.join(albumPath, file); + const command = `salmon check mqa "${filePath}"`; + + try { + const { stdout } = await execPromise(command); + const isMQA = !stdout.includes('Did not find MQA syncword'); + + outputLog += `[${file}]: ${isMQA ? "MQA DETECTED" : "Clean"}\n`; + + if (isMQA) { + mqaDetected = true; + } + } catch (e) { + const errorMessage = e instanceof Error ? e.message : String(e); + outputLog += `[${file}]: Error - ${errorMessage}\n`; + } + } + + const response: CheckMQAResponse = { + success: true, + isMQA: mqaDetected, + output: outputLog + }; + + return NextResponse.json(response); + + } catch (error) { + console.error('Error checking MQA:', error); + return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); + } +} diff --git a/app/api/check/upconv/route.ts b/app/api/check/upconv/route.ts new file mode 100644 index 0000000..faa3d34 --- /dev/null +++ b/app/api/check/upconv/route.ts @@ -0,0 +1,89 @@ +import { NextResponse } from 'next/server'; +import { exec } from 'child_process'; +import util from 'util'; +import fs from 'fs-extra'; +import path from 'path'; +import * as mm from 'music-metadata'; +import { CheckUpconvResponse } from '@/types'; + +const execPromise = util.promisify(exec); + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + // Find all FLAC files + const files = await fs.readdir(albumPath); + const flacFiles = files.filter(f => f.toLowerCase().endsWith('.flac')); + + if (flacFiles.length === 0) { + return NextResponse.json({ error: 'No FLAC files found' }, { status: 400 }); + } + + let outputLog = ""; + let failureCount = 0; + let checkedCount = 0; + + // Check all 24-bit files + for (const file of flacFiles) { + const filePath = path.join(albumPath, file); + + try { + // Check bit depth first + const metadata = await mm.parseFile(filePath); + const bitsPerSample = metadata.format.bitsPerSample || 16; + + if (bitsPerSample < 24) { + continue; // Skip non-24-bit files + } + + checkedCount++; + const command = `salmon check upconv "${filePath}"`; + const { stdout } = await execPromise(command); + + // Output example: "01...flac: does not have a high number of wasted bits (Wasted bits: 0/24)" + const match = stdout.match(/Wasted bits: (\d+\/\d+)/); + const wastedBits = match ? match[1] : 'Unknown'; + + // Determine pass/fail based on wasted bits (simplified logic: if wasted bits > 0, it might be upconv, but usually salmon says "has a high number..." if it fails) + // Actually salmon output usually says "does not have a high number..." for pass. + // Let's rely on the text "does not have a high number". + const passed = stdout.includes('does not have a high number'); + + outputLog += `[${file}]: ${passed ? "OK" : "POSSIBLE UPCONV"} (${wastedBits})\n`; + + if (!passed) { + failureCount++; + } + + } catch (e) { + const errorMessage = e instanceof Error ? e.message : String(e); + outputLog += `[${file}]: Error - ${errorMessage}\n`; + } + } + + if (checkedCount === 0) { + const response: CheckUpconvResponse = { + success: true, + output: "No 24-bit files found to check.", + wastedBits: "N/A" + }; + return NextResponse.json(response); + } + + const response: CheckUpconvResponse = { + success: true, + output: outputLog, + wastedBits: failureCount > 0 ? "Issues Found" : "Clean" + }; + return NextResponse.json(response); + + } catch (error) { + console.error('Error checking upconv:', error); + return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); + } +} diff --git a/app/api/copy/route.ts b/app/api/copy/route.ts new file mode 100644 index 0000000..10ffff0 --- /dev/null +++ b/app/api/copy/route.ts @@ -0,0 +1,52 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { getOutputDir } from '@/lib/utils/paths'; +import { copyDirRecursive } from '@/lib/utils/file-ops'; +import { CopyResponse } from '@/types'; + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const outputDir = getOutputDir(); + if (!outputDir) { + return NextResponse.json({ error: 'OUTPUT_DIR not configured in .env.local' }, { status: 400 }); + } + + // Ensure output directory exists + await fs.ensureDir(outputDir); + + const albumName = path.basename(albumPath); + const destPath = path.join(outputDir, albumName); + + // Check if destination already exists + if (await fs.pathExists(destPath)) { + return NextResponse.json({ error: 'Album already exists in output directory' }, { status: 409 }); + } + + + try { + await fs.copy(albumPath, destPath); + } catch (error) { + const err = error as NodeJS.ErrnoException; + if (err.code === 'EINVAL') { + console.warn('fs-extra copy failed with EINVAL, attempting fallback to stream-based copy', error); + // Fallback to custom stream-based copy to avoid copyfile syscall + await copyDirRecursive(albumPath, destPath); + } else { + throw error; + } + } + + const response: CopyResponse = { success: true, destPath }; + return NextResponse.json(response); + } catch (error) { + console.error('Error copying album:', error); + return NextResponse.json({ error: 'Failed to copy album' }, { status: 500 }); + } +} diff --git a/app/api/cover/route.ts b/app/api/cover/route.ts new file mode 100644 index 0000000..90690d6 --- /dev/null +++ b/app/api/cover/route.ts @@ -0,0 +1,43 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import mime from 'mime'; + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const filePath = searchParams.get('path'); + + if (!filePath) { + return NextResponse.json({ error: 'Path is required' }, { status: 400 }); + } + + // Security check: Ensure we are only serving files from allowed locations? + // For this local tool, we might be lenient, but ideally we should check if it's in the watch folder. + // However, the watch folder location is dynamic. + // Let's at least check if it exists. + + try { + if (!await fs.pathExists(filePath)) { + return NextResponse.json({ error: 'File not found' }, { status: 404 }); + } + + const stat = await fs.stat(filePath); + if (!stat.isFile()) { + return NextResponse.json({ error: 'Not a file' }, { status: 400 }); + } + + const fileBuffer = await fs.readFile(filePath); + const contentType = mime.getType(filePath) || 'application/octet-stream'; + + return new NextResponse(fileBuffer, { + headers: { + 'Content-Type': contentType, + 'Content-Length': stat.size.toString(), + 'Cache-Control': 'public, max-age=3600' + } + }); + } catch (error) { + console.error('Error serving file:', error); + return NextResponse.json({ error: 'Failed to serve file' }, { status: 500 }); + } +} diff --git a/app/api/delete/route.ts b/app/api/delete/route.ts new file mode 100644 index 0000000..4a16eae --- /dev/null +++ b/app/api/delete/route.ts @@ -0,0 +1,45 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { getSpectrogramsPath } from '@/lib/utils/paths'; + +export async function POST(request: Request) { + try { + const { albumPath, upc } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + // 1. Delete the album directory + await fs.remove(albumPath); + + // 2. Delete the spectrograms directory for this album + const specRoot = getSpectrogramsPath(); + const albumName = path.basename(albumPath); + + // Try UPC first, then album name + let specDir = path.join(specRoot, upc || albumName); + if (await fs.pathExists(specDir)) { + await fs.remove(specDir); + } else if (upc && await fs.pathExists(path.join(specRoot, albumName))) { + // Fallback: check album name if UPC dir didn't exist but UPC was provided + await fs.remove(path.join(specRoot, albumName)); + } + + // 3. Conditionally delete the generated torrent file + if (process.env.DELETE_GENERATED_TORRENTS === 'true') { + const parentDir = path.dirname(albumPath); + const torrentPath = path.join(parentDir, `${albumName}.torrent`); + if (await fs.pathExists(torrentPath)) { + await fs.remove(torrentPath); + console.log(`Deleted generated torrent: ${torrentPath}`); + } + } + + return NextResponse.json({ success: true }); + } catch (error) { + console.error('Error deleting album:', error); + return NextResponse.json({ error: 'Failed to delete album' }, { status: 500 }); + } +} diff --git a/app/api/propose-rename/route.ts b/app/api/propose-rename/route.ts new file mode 100644 index 0000000..c55a5a0 --- /dev/null +++ b/app/api/propose-rename/route.ts @@ -0,0 +1,84 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { ProposeRenameResponse, RenameProposal } from '@/types'; + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const files = await fs.readdir(albumPath); + const folderName = path.basename(albumPath); + // Max length for file + folder + separator is 179 (to match frontend check > 179) + // So max file length = 179 - folderName.length - 1 (separator) + const maxFileLength = 179 - folderName.length - 1; + + const problematicFiles: RenameProposal[] = []; + const allFiles: RenameProposal[] = []; + + for (const file of files) { + const filePath = path.join(albumPath, file); + const stat = await fs.stat(filePath); + + if (stat.isFile()) { + const ext = path.extname(file); + const name = path.basename(file, ext); + + // Strategy 1: Remove Brackets [] + const nameNoBrackets = name.replace(/\[.*?\]/g, '').replace(/\s+/g, ' ').trim(); + const fileNoBrackets = nameNoBrackets + ext; + + // Strategy 2: Remove Parentheses () + const nameNoParens = name.replace(/\(.*?\)/g, '').replace(/\s+/g, ' ').trim(); + const fileNoParens = nameNoParens + ext; + + // Strategy 3: Remove Both + const nameClean = name.replace(/\[.*?\]/g, '').replace(/\(.*?\)/g, '').replace(/\s+/g, ' ').trim(); + const fileClean = nameClean + ext; + + // Strategy 4: Truncate (fallback if others fail or just as an option) + // We need to truncate 'name' so that name + ext <= maxFileLength + const maxNameLength = maxFileLength - ext.length; + let nameTruncated = name; + if (name.length > maxNameLength) { + nameTruncated = name.substring(0, maxNameLength).trim(); + } + const fileTruncated = nameTruncated + ext; + + const proposal: RenameProposal = { + original: file, + strategies: { + remove_brackets: fileNoBrackets.length <= maxFileLength ? fileNoBrackets : null, + remove_parens: fileNoParens.length <= maxFileLength ? fileNoParens : null, + remove_both: fileClean.length <= maxFileLength ? fileClean : null, + truncate: fileTruncated + } + }; + + allFiles.push(proposal); + + // Check if file exceeds limit + if (file.length > maxFileLength) { + problematicFiles.push(proposal); + } + } + } + + const response: ProposeRenameResponse = { + success: true, + problematicFiles, + allFiles, + maxFileLength + }; + + return NextResponse.json(response); + + } catch (error) { + console.error('Error proposing renames:', error); + return NextResponse.json({ error: 'Failed to propose renames' }, { status: 500 }); + } +} diff --git a/app/api/qbittorrent/inject/route.ts b/app/api/qbittorrent/inject/route.ts new file mode 100644 index 0000000..2d70ccb --- /dev/null +++ b/app/api/qbittorrent/inject/route.ts @@ -0,0 +1,60 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { addTorrent, recheckTorrent } from '@/lib/qbittorrent'; +import { QbittorrentInjectResponse } from '@/types'; + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const parentDir = path.dirname(albumPath); + const albumDirName = path.basename(albumPath); + + // Logic to find the torrent file (similar to torrent creation route) + let torrentPath = path.join(parentDir, `${albumDirName}.torrent`); + + if (!await fs.pathExists(torrentPath)) { + // Try to find a recent torrent file if exact match fails + const files = await fs.readdir(parentDir); + const recentTorrent = (await Promise.all(files + .filter(f => f.endsWith('.torrent')) + .map(async f => { + const stat = await fs.stat(path.join(parentDir, f)); + return { name: f, mtime: stat.mtimeMs }; + }) + )) + .sort((a, b) => b.mtime - a.mtime)[0]; + + if (recentTorrent) { + torrentPath = path.join(parentDir, recentTorrent.name); + } else { + return NextResponse.json({ error: 'Torrent file not found. Please create it first.' }, { status: 404 }); + } + } + + const torrentData = await fs.readFile(torrentPath); + const filename = path.basename(torrentPath); + + // 1. Add torrent (paused) + const hash = await addTorrent(torrentData, filename, 'RED'); + + // 2. Trigger recheck + await recheckTorrent(hash); + + const response: QbittorrentInjectResponse = { success: true, hash }; + return NextResponse.json(response); + + } catch (error) { + console.error('Error injecting torrent:', error); + const errorMessage = error instanceof Error ? error.message : String(error); + return NextResponse.json({ + error: 'Failed to inject torrent', + details: errorMessage + }, { status: 500 }); + } +} diff --git a/app/api/qbittorrent/resume/route.ts b/app/api/qbittorrent/resume/route.ts new file mode 100644 index 0000000..8ac0f6b --- /dev/null +++ b/app/api/qbittorrent/resume/route.ts @@ -0,0 +1,26 @@ +import { NextResponse } from 'next/server'; +import { resumeTorrent } from '@/lib/qbittorrent'; +import { QbittorrentResumeResponse } from '@/types'; + +export async function POST(request: Request) { + try { + const { hash } = await request.json(); + + if (!hash) { + return NextResponse.json({ error: 'Hash is required' }, { status: 400 }); + } + + await resumeTorrent(hash); + + const response: QbittorrentResumeResponse = { success: true }; + return NextResponse.json(response); + + } catch (error) { + console.error('Error resuming torrent:', error); + const errorMessage = error instanceof Error ? error.message : String(error); + return NextResponse.json({ + error: 'Failed to resume torrent', + details: errorMessage + }, { status: 500 }); + } +} diff --git a/app/api/qbittorrent/status/route.ts b/app/api/qbittorrent/status/route.ts new file mode 100644 index 0000000..5508b21 --- /dev/null +++ b/app/api/qbittorrent/status/route.ts @@ -0,0 +1,28 @@ +import { NextResponse } from 'next/server'; +import { getTorrentInfo } from '@/lib/qbittorrent'; +import { QbittorrentStatusResponse } from '@/types'; + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const hash = searchParams.get('hash'); + + if (!hash) { + return NextResponse.json({ error: 'Hash is required' }, { status: 400 }); + } + + try { + const info = await getTorrentInfo(hash); + if (!info) { + return NextResponse.json({ error: 'Torrent not found' }, { status: 404 }); + } + const response: QbittorrentStatusResponse = { success: true, info }; + return NextResponse.json(response); + } catch (error) { + console.error('Error getting torrent status:', error); + const errorMessage = error instanceof Error ? error.message : String(error); + return NextResponse.json({ + error: 'Failed to get status', + details: errorMessage + }, { status: 500 }); + } +} diff --git a/app/api/red-template/route.ts b/app/api/red-template/route.ts new file mode 100644 index 0000000..be7f221 --- /dev/null +++ b/app/api/red-template/route.ts @@ -0,0 +1,222 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { getFlacMetadata, parseLabel } from '@/lib/utils/audio'; +import { AnalysisTrack, ApiResponse, AlbumResponse } from '@/types'; + +export async function POST(request: Request) { + try { + const { albumPath, releaseType } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const files = await fs.readdir(albumPath); + const flacFiles = files.filter((file) => file.toLowerCase().endsWith('.flac')); + + if (flacFiles.length === 0) { + return NextResponse.json({ error: 'No FLAC files found' }, { status: 400 }); + } + + const tracks: AnalysisTrack[] = await Promise.all( + flacFiles.map(async (file) => { + const filePath = path.join(albumPath, file); + const metadata = await getFlacMetadata(filePath); + return { + filename: file, + path: filePath, + ...metadata, + }; + }) + ); + + // Sort tracks + tracks.sort((a, b) => { + if ('error' in a || 'error' in b) return 0; + const trackA = a.common?.track?.no ?? 0; + const trackB = b.common?.track?.no ?? 0; + if (trackA && trackB) return trackA - trackB; + return a.filename.localeCompare(b.filename); + }); + + // Analyze quality for description + let isLossless = true; + let isHiRes = true; + let mixed = false; + let qualityDetails = ''; + const sampleRates = new Set(); + const bitDepths = new Set(); + + tracks.forEach((track) => { + if ('error' in track) return; + const sr = track.format?.sampleRate; + const bd = track.format?.bitsPerSample; + if (sr) sampleRates.add(sr); + if (bd) bitDepths.add(bd); + if (sr !== 44100 || bd !== 16) isLossless = false; + if (!sr || sr < 48000 || !bd || bd < 24) isHiRes = false; + }); + + if (sampleRates.size > 1 || bitDepths.size > 1) { + mixed = true; + qualityDetails = `\n\nNOTE: Mixed formats. Sample Rates: ${Array.from(sampleRates).join(', ')} Hz. Bit Depths: ${Array.from(bitDepths).join(', ')} bit.`; + + const mixedDetails = tracks.map(t => { + if ('error' in t) return `${t.filename}: Error`; + return `Track ${t.common?.track?.no || '?'}: ${t.format?.bitsPerSample}bit / ${t.format?.sampleRate}Hz`; + }).join('\n'); + + qualityDetails += '\n' + mixedDetails; + } + + const firstTrack = tracks.find((t): t is Extract => !('error' in t)); + if (!firstTrack) { + return NextResponse.json({ error: 'No valid tracks found' }, { status: 400 }); + } + + const albumName = firstTrack.common?.album || 'Unknown Album'; + const year = firstTrack.common?.year || (firstTrack.common?.date ? parseInt(firstTrack.common.date.split('-')[0]) : 2025); + + let label = parseLabel(firstTrack.common?.copyright || ''); + + const upc = firstTrack.native?.vorbis?.find(tag => tag.id === 'UPC')?.value || firstTrack.common?.barcode || ''; + + // Artists + // Artists Logic + + // Helper to split artists + const splitArtists = (artistString: string) => { + return artistString.split(/,\s+|\s+\/\s+|;\s+/).map((a: string) => a.trim()).filter((a: string) => a.length > 0); + }; + + // Collect all artists and their frequencies + const artistCounts = new Map(); + const allUniqueArtists = new Set(); + + tracks.forEach(t => { + if ('error' in t) return; + let trackArtists: string[] = []; + // music-metadata might return artists as an array, but sometimes elements are comma-separated strings + if (t.common?.artists) { + t.common.artists.forEach((a: string) => trackArtists.push(...splitArtists(a))); + } else if (t.common?.artist) { + trackArtists = splitArtists(t.common.artist); + } + + trackArtists.forEach(a => { + allUniqueArtists.add(a); + artistCounts.set(a, (artistCounts.get(a) || 0) + 1); + }); + }); + + let mainArtists: { name: string }[] = []; + const withArtists: { name: string }[] = []; + + if (releaseType === 7) { + // Compilation: All artists in mainArtists, no withArtists + allUniqueArtists.forEach(a => { + if (a !== 'Various Artists') { + mainArtists.push({ name: a }); + } + }); + } else { + // Standard Logic + // Determine Main Artist String + let mainArtistName = firstTrack.common?.albumartist || 'Various Artists'; + + // If album artist is Various Artists (or missing), find the most common artist + if (mainArtistName === 'Various Artists' || !mainArtistName) { + let maxCount = 0; + let mostFrequent = ''; + artistCounts.forEach((count, artist) => { + if (count > maxCount) { + maxCount = count; + mostFrequent = artist; + } + }); + if (mostFrequent) { + mainArtistName = mostFrequent; + } + } + + // Split main artist into components for the array + // Use the same split logic as above + const mainArtistComponents = splitArtists(mainArtistName); + mainArtists = mainArtistComponents.map(name => ({ name })); + + // Determine With Artists + allUniqueArtists.forEach(a => { + // Exclude all main artist components and "Various Artists" from "with" list + if (!mainArtistComponents.includes(a) && a !== 'Various Artists') { + withArtists.push({ name: a }); + } + }); + } + + // Tracklist + const tracklist = tracks.map(t => { + if ('error' in t) return `${t.filename} (Error)`; + return `${t.common?.track?.no || '00'}. ${t.common?.title || t.filename}`; + }).join('\n'); + + // Description + let description = "Sourced from TIDAL"; + if (mixed) { + description += qualityDetails; + } + + // Encoding + let encoding = "Lossless"; + const maxBitDepth = Math.max(...Array.from(bitDepths).map(Number)); + if (maxBitDepth >= 24) { + encoding = "24bit Lossless"; + } + + const response = { + status: "success", + response: { + source: "Crossfade", + group: { + wikiBody: tracklist, + bbBody: tracklist, + name: albumName, + year: year, + categoryId: 1, + releaseType: releaseType || 1, // Default to Album (1) + categoryName: "Music", + musicInfo: { + composers: [], + dj: [], + artists: mainArtists, + with: withArtists, + conductor: [], + remixedBy: [], + producer: [] + }, + recordLabel: label, + catalogueNumber: upc, + tags: [] // Empty for now, hard to guess + }, + torrent: { + media: "WEB", + format: "FLAC", + encoding: encoding, + //remastered: true, + remasterYear: year, + remasterRecordLabel: label, + remasterCatalogueNumber: upc, + description: description, + //fileCount: tracks.length, + //filePath: `${mainArtistName} - ${albumName} (${year}) [FLAC]` + } + } + }; + + return NextResponse.json(response); + + } catch (error) { + console.error('Error generating RED template:', error); + return NextResponse.json({ error: 'Failed to generate template' }, { status: 500 }); + } +} diff --git a/app/api/sanitize/route.ts b/app/api/sanitize/route.ts new file mode 100644 index 0000000..a653258 --- /dev/null +++ b/app/api/sanitize/route.ts @@ -0,0 +1,54 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { sanitizeName, sanitizeAlbumName } from '@/lib/utils/sanitize'; + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const files = await fs.readdir(albumPath); + + // 1. Rename files + for (const file of files) { + const oldPath = path.join(albumPath, file); + const stat = await fs.stat(oldPath); + + if (stat.isFile()) { + const ext = path.extname(file); + const name = path.basename(file, ext); + const cleanName = sanitizeName(name) + ext; + + if (cleanName !== file) { + const newPath = path.join(albumPath, cleanName); + await fs.rename(oldPath, newPath); + } + } + } + + // 2. Rename album folder + const parentDir = path.dirname(albumPath); + const oldDirName = path.basename(albumPath); + const cleanDirName = sanitizeAlbumName(oldDirName); + + let newAlbumPath = albumPath; + + if (cleanDirName !== oldDirName) { + newAlbumPath = path.join(parentDir, cleanDirName); + await fs.rename(albumPath, newAlbumPath); + } + + return NextResponse.json({ + success: true, + newAlbumPath, + message: 'Sanitization complete' + }); + } catch (error) { + console.error('Error sanitizing album:', error); + return NextResponse.json({ error: 'Failed to sanitize album' }, { status: 500 }); + } +} diff --git a/app/api/scan/route.ts b/app/api/scan/route.ts new file mode 100644 index 0000000..85742e5 --- /dev/null +++ b/app/api/scan/route.ts @@ -0,0 +1,49 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { getWatchPath, ensureWatchDir } from '@/lib/utils/paths'; + +export async function GET() { + try { + const watchPath = await ensureWatchDir(); + const entries = await fs.readdir(watchPath, { withFileTypes: true }); + + const albums = await Promise.all( + entries + .filter((entry) => entry.isDirectory()) + .map(async (entry) => { + const fullPath = path.join(watchPath, entry.name); + + let coverPath: string | null = null; + try { + const files = await fs.readdir(fullPath); + const imageFiles = files.filter(f => /\.(jpg|jpeg|png)$/i.test(f)); + + // Priority 1: cover.jpg/jpeg/png + const explicitCover = imageFiles.find(f => /^cover\.(jpg|jpeg|png)$/i.test(f)); + + if (explicitCover) { + coverPath = path.join(fullPath, explicitCover); + } else if (imageFiles.length > 0) { + // Priority 2: Random image + coverPath = path.join(fullPath, imageFiles[0]); + } + } catch (e) { + // Ignore errors reading directory + } + + return { + name: entry.name, + path: fullPath, + hasCover: !!coverPath, + coverPath + }; + }) + ); + + return NextResponse.json({ albums }); + } catch (error) { + console.error('Error scanning watch folder:', error); + return NextResponse.json({ error: 'Failed to scan watch folder' }, { status: 500 }); + } +} diff --git a/app/api/spectrogram/route.ts b/app/api/spectrogram/route.ts new file mode 100644 index 0000000..4c3fba5 --- /dev/null +++ b/app/api/spectrogram/route.ts @@ -0,0 +1,126 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs-extra'; +import path from 'path'; +import { execFile } from 'child_process'; +import util from 'util'; +import { getSpectrogramsPath, ensureSpectrogramsDir } from '@/lib/utils/paths'; +import { AnalysisTrack, SpectrogramResponse } from '@/types'; + +const execFileAsync = util.promisify(execFile); + +export async function POST(request: Request) { + try { + const { albumPath, tracks, upc } = await request.json(); + + if (!albumPath || !tracks || !Array.isArray(tracks)) { + return NextResponse.json({ error: 'Invalid request' }, { status: 400 }); + } + + const specRoot = await ensureSpectrogramsDir(); + // Use UPC if available, otherwise fallback to album directory name + const albumId = upc || path.basename(albumPath); + const albumSpecDir = path.join(specRoot, albumId); + + await fs.ensureDir(albumSpecDir); + + const results: Record = {}; + + // Process tracks + // We use Promise.all to process in parallel. + // If this causes performance issues with sox, we might need to limit concurrency. + await Promise.all(tracks.map(async (track: AnalysisTrack) => { + if ('error' in track) return; + + const trackNo = track.common?.track?.no; + if (trackNo === undefined || trackNo === null) return; + + const outputFilename = `${trackNo}.png`; + const outputPath = path.join(albumSpecDir, outputFilename); + const relativePath = path.join(albumId, outputFilename); + const publicUrl = `/api/spectrogram?path=${encodeURIComponent(relativePath)}`; + + const exists = await fs.pathExists(outputPath); + + if (!exists) { + // Generate + const title = `${trackNo} - ${track.common?.title || track.filename}`; + + const args = [ + track.path, + '-n', + ]; + + if (process.env.GENERATE_MONO_SPECTROGRAMS) { + args.push('remix', '1'); + } + + args.push( + 'spectrogram', + '-t', title, + '-o', outputPath + ); + + try { + await execFileAsync('sox', args); + results[track.filename] = { exists: true, url: publicUrl }; + } catch (e) { + console.error(`Failed to generate spectrogram for ${track.filename}:`, e); + results[track.filename] = { exists: false }; + } + } else { + results[track.filename] = { exists: true, url: publicUrl }; + } + })); + + return NextResponse.json({ results }); + + } catch (error) { + console.error('Error generating spectrograms:', error); + return NextResponse.json({ error: 'Failed to generate spectrograms' }, { status: 500 }); + } +} + +export async function DELETE() { + try { + const specPath = getSpectrogramsPath(); + await fs.remove(specPath); + await fs.ensureDir(specPath); + return NextResponse.json({ success: true }); + } catch (error) { + console.error('Error purging spectrograms:', error); + return NextResponse.json({ error: 'Failed to purge spectrograms' }, { status: 500 }); + } +} + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const relativePath = searchParams.get('path'); + + if (!relativePath) { + return NextResponse.json({ error: 'Missing path' }, { status: 400 }); + } + + const specRoot = getSpectrogramsPath(); + const fullPath = path.join(specRoot, relativePath); + + // Security check: ensure fullPath is within specRoot (prevent directory traversal) + const resolvedPath = path.resolve(fullPath); + const resolvedRoot = path.resolve(specRoot); + + if (!resolvedPath.startsWith(resolvedRoot)) { + return NextResponse.json({ error: 'Access denied' }, { status: 403 }); + } + + if (!await fs.pathExists(resolvedPath)) { + return NextResponse.json({ error: 'File not found' }, { status: 404 }); + } + + const fileBuffer = await fs.readFile(resolvedPath); + + return new NextResponse(fileBuffer, { + headers: { + 'Content-Type': 'image/png', + 'Cache-Control': 'public, max-age=31536000, immutable', + }, + }); +} diff --git a/app/api/system/check-tools/route.ts b/app/api/system/check-tools/route.ts new file mode 100644 index 0000000..24eaeb8 --- /dev/null +++ b/app/api/system/check-tools/route.ts @@ -0,0 +1,7 @@ +import { checkTools } from '@/lib/tool-check'; +import { NextResponse } from 'next/server'; + +export async function GET() { + const result = await checkTools(); + return NextResponse.json(result); +} diff --git a/app/api/tidal/search/route.ts b/app/api/tidal/search/route.ts new file mode 100644 index 0000000..bb8955f --- /dev/null +++ b/app/api/tidal/search/route.ts @@ -0,0 +1,286 @@ +import { NextRequest, NextResponse } from "next/server"; + +// Global cache for the access token to avoid refetching on every request. +// This persists in memory as long as the server (or lambda container) is alive. +let cachedToken: string | null = null; +let tokenExpiry: number = 0; + +async function getAccessToken(clientId: string, clientSecret: string): Promise { + // Check if we have a valid cached token (with 5 minute buffer) + if (cachedToken && Date.now() < tokenExpiry) { + return cachedToken; + } + + console.log("Refreshing TIDAL access token..."); + try { + const authString = Buffer.from(`${clientId}:${clientSecret}`).toString("base64"); + const res = await fetch("https://auth.tidal.com/v1/oauth2/token", { + method: "POST", + headers: { + "Authorization": `Basic ${authString}`, + "Content-Type": "application/x-www-form-urlencoded", + }, + body: "grant_type=client_credentials", + cache: 'no-store' // Ensure we don't get a stale cached response from Next.js + }); + + if (!res.ok) { + console.error("TIDAL Auth Failed:", await res.text()); + return null; + } + + const data = await res.json(); + cachedToken = data.access_token; + // Set expiry buffer (e.g., expires in 1 hour, we refresh after 55 mins) + // expires_in is in seconds + const expiresIn = data.expires_in || 3600; + tokenExpiry = Date.now() + (expiresIn * 1000) - 300000; + + return cachedToken; + } catch (error) { + console.error("TIDAL Auth Exception:", error); + return null; + } +} + +// Wrapper for TIDAL API requests that handles auth and 401 retries +async function fetchTidal(url: string, clientId: string, clientSecret: string) { + let token = await getAccessToken(clientId, clientSecret); + if (!token) throw new Error("Could not obtain access token"); + + let res = await fetch(url, { + headers: { + "Authorization": `Bearer ${token}`, + "Content-Type": "application/vnd.api+json", + }, + }); + + // If unauthorized, invalid token, or expired: clear cache and retry once + if (res.status === 401) { + console.warn("Got 401 from TIDAL, retrying with new token..."); + cachedToken = null; + tokenExpiry = 0; + + token = await getAccessToken(clientId, clientSecret); + if (!token) throw new Error("Could not refresh access token"); + + res = await fetch(url, { + headers: { + "Authorization": `Bearer ${token}`, + "Content-Type": "application/vnd.api+json", + }, + }); + } + + return res; +} + +export async function GET(request: NextRequest) { + const searchParams = request.nextUrl.searchParams; + const query = searchParams.get("query"); + const countryCode = searchParams.get("countryCode") || "US"; + + if (!query) { + return NextResponse.json({ error: "Query parameter is required" }, { status: 400 }); + } + + const clientId = process.env.TIDAL_CLIENT_ID; + const clientSecret = process.env.TIDAL_CLIENT_SECRET; + + if (!clientId || !clientSecret) { + return NextResponse.json({ error: "TIDAL credentials not configured" }, { status: 500 }); + } + + try { + // 1. Search TIDAL + const searchUrl = `https://openapi.tidal.com/v2/searchResults/${encodeURIComponent(query)}?countryCode=${countryCode}&explicitFilter=include%2C%20exclude&include=albums,albums.artists,albums.coverArt`; + + const searchRes = await fetchTidal(searchUrl, clientId, clientSecret); + + if (!searchRes.ok) { + const errorText = await searchRes.text(); + console.error("TIDAL Search Error:", errorText); + return NextResponse.json({ error: "Failed to search TIDAL", details: errorText }, { status: searchRes.status }); + } + + const searchData = await searchRes.json(); + + //console.log("TIDAL Search Data:", JSON.stringify(searchData, null, 2)); + + // Parse JSON:API response + const albumsMap = new Map(); + const artistIds = new Set(); + const artworkIds = new Set(); + + // Process Albums from 'included' to get IDs + if (searchData.included) { + searchData.included.forEach((item: Record) => { + if (item.type === "albums") { + const attr = item.attributes; + + // Duration parsing + let duration = 0; + if (attr.duration) { + try { + const match = attr.duration.match(/PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/); + if (match) { + duration = parseInt(match[1] || "0") * 3600 + parseInt(match[2] || "0") * 60 + parseInt(match[3] || "0"); + } + } catch (e) { } + } + + // Collect Artist IDs + if (item.relationships?.artists?.data) { + const artistsData = Array.isArray(item.relationships.artists.data) + ? item.relationships.artists.data + : [item.relationships.artists.data]; + artistsData.forEach((a: { id: string }) => artistIds.add(a.id)); + } + + // Collect CoverArt IDs + let coverArtId = null; + if (item.relationships?.coverArt?.data) { + const coverData = item.relationships.coverArt.data; + const firstCover = Array.isArray(coverData) ? coverData[0] : coverData; + if (firstCover && firstCover.id) { + artworkIds.add(firstCover.id); + coverArtId = firstCover.id; + } + } + + albumsMap.set(item.id, { + id: item.id, + title: attr.title, + artists: [], // To be filled + duration: duration, + url: attr.externalLinks?.[0]?.href || `https://tidal.com/browse/album/${item.id}`, + releaseDate: attr.releaseDate, + mediaTags: attr.mediaTags || [], + imageCover: [], // To be filled + _artistIds: item.relationships?.artists?.data?.map((a: { id: string }) => a.id) || [], + _coverArtId: coverArtId + }); + } + }); + } + + // Helper to chunk array + const chunkArray = (array: string[], size: number) => { + const chunks = []; + for (let i = 0; i < array.length; i += size) { + chunks.push(array.slice(i, i + size)); + } + return chunks; + }; + + // 2. Bulk Fetch Artists + const artistsMap = new Map(); + if (artistIds.size > 0) { + const allArtistIds = Array.from(artistIds); + const chunks = chunkArray(allArtistIds, 20); // API Limit: 20 + + await Promise.all(chunks.map(async (chunk) => { + const ids = chunk.join(","); + const artistsUrl = `https://openapi.tidal.com/v2/artists?countryCode=${countryCode}&filter[id]=${ids}`; + try { + const res = await fetchTidal(artistsUrl, clientId, clientSecret); + if (res.ok) { + const data = await res.json(); + data.data?.forEach((item: Record) => { + artistsMap.set(item.id, { name: item.attributes.name }); + }); + } else { + console.error("Failed to fetch artists batch:", await res.text()); + } + } catch (e) { + console.error("Error fetching artists batch", e); + } + })); + } + + // 3. Bulk Fetch Artworks + const artworksMap = new Map(); + if (artworkIds.size > 0) { + const allArtworkIds = Array.from(artworkIds); + const chunks = chunkArray(allArtworkIds, 20); // API Limit: 20 (assumed same as artists) + + await Promise.all(chunks.map(async (chunk) => { + const ids = chunk.join(","); + const artworksUrl = `https://openapi.tidal.com/v2/artworks?countryCode=${countryCode}&filter[id]=${ids}`; + try { + const res = await fetchTidal(artworksUrl, clientId, clientSecret); + if (res.ok) { + const data = await res.json(); + data.data?.forEach((item: Record) => { + const images: { url: string, width: number, height: number }[] = []; + + // Structure seen in logs: item.attributes.files is an array of { href, meta: { width, height } } + if (item.attributes.files && Array.isArray(item.attributes.files)) { + item.attributes.files.forEach((file: Record) => { + images.push({ + url: file.href, + width: file.meta?.width || 0, + height: file.meta?.height || 0 + }); + }); + } + // Fallback structure (imageLinks) + else if (item.attributes.imageLinks && Array.isArray(item.attributes.imageLinks)) { + item.attributes.imageLinks.forEach((link: Record) => { + images.push({ url: link.href, width: link.width || 0, height: link.height || 0 }); + }); + } + + // Priority 3: Fallback - Construct URLs manually if we have an ID and parsing failed + if (images.length === 0) { + const availableSizes = [80, 160, 320, 640, 1280]; + availableSizes.forEach(size => { + images.push({ + url: `https://resources.tidal.com/images/${item.id.replace(/-/g, '/')}/${size}x${size}.jpg`, + width: size, + height: size + }); + }); + } + + artworksMap.set(item.id, images); + }); + } + } catch (e) { console.error("Error fetching artworks batch", e); } + })); + } + + // 4. Merge Data + const albums = Array.from(albumsMap.values() as IterableIterator>).map(album => { + // Fill Artists + if (album._artistIds) { + album.artists = album._artistIds.map((id: string) => artistsMap.get(id) || { name: "Unknown" }); + } + // Fill Artwork + if (album._coverArtId) { + const covers = artworksMap.get(album._coverArtId); + if (covers) { + album.imageCover = covers; + } else { + // Fallback to direct resource URL if we have the ID but fetch failed + album.imageCover = [ + { url: `https://resources.tidal.com/images/${album._coverArtId.replace(/-/g, '/')}/640x640.jpg`, width: 640, height: 640 }, + { url: `https://resources.tidal.com/images/${album._coverArtId.replace(/-/g, '/')}/320x320.jpg`, width: 320, height: 320 } + ]; + } + } + + // Cleanup internal keys + delete album._artistIds; + delete album._coverArtId; + + return album; + }); + + return NextResponse.json({ albums }); + + } catch (error) { + console.error("Search API Error:", error); + return NextResponse.json({ error: "Internal server error" }, { status: 500 }); + } +} diff --git a/app/api/torrent/route.ts b/app/api/torrent/route.ts new file mode 100644 index 0000000..333ce16 --- /dev/null +++ b/app/api/torrent/route.ts @@ -0,0 +1,90 @@ +import { NextResponse } from 'next/server'; +import { exec } from 'child_process'; +import util from 'util'; +import fs from 'fs-extra'; +import path from 'path'; +import { TorrentCreationResponse } from '@/types'; + +const execPromise = util.promisify(exec); + +interface ExecError extends Error { + stdout?: string; + stderr?: string; +} + +export async function POST(request: Request) { + try { + const { albumPath } = await request.json(); + + if (!albumPath || !(await fs.pathExists(albumPath))) { + return NextResponse.json({ error: 'Invalid album path' }, { status: 400 }); + } + + const parentDir = path.dirname(albumPath); + const albumDirName = path.basename(albumPath); + + // Command: mkbrr create -P red + // Run in parent directory so the torrent file is created there + const command = `mkbrr create "${albumDirName}" -P red`; + + console.log('Running command:', command, 'in', parentDir); + + const { stdout, stderr } = await execPromise(command, { cwd: parentDir }); + + // Expected torrent file path + let torrentPath = path.join(parentDir, `${albumDirName}.torrent`); + + if (!await fs.pathExists(torrentPath)) { + console.log(`Expected torrent file not found at: ${torrentPath}`); + console.log('Listing files in parent directory to find match...'); + + const files = await fs.readdir(parentDir); + console.log('Files in directory:', files); + + // Try to find a .torrent file that was created very recently (last 10 seconds) + // and looks related (contains part of the name or just is a torrent file) + const recentTorrent = (await Promise.all(files + .filter(f => f.endsWith('.torrent')) + .map(async f => { + const stat = await fs.stat(path.join(parentDir, f)); + return { name: f, mtime: stat.mtimeMs }; + }) + )) + .sort((a, b) => b.mtime - a.mtime)[0]; // Sort by newest + + if (recentTorrent) { + console.log(`Found recent torrent file: ${recentTorrent.name}`); + torrentPath = path.join(parentDir, recentTorrent.name); + } + } + + if (await fs.pathExists(torrentPath)) { + const torrentData = await fs.readFile(torrentPath); + const response: TorrentCreationResponse = { + success: true, + output: stdout, + filename: path.basename(torrentPath), + data: torrentData.toString('base64') + }; + return NextResponse.json(response); + } else { + const response: TorrentCreationResponse = { + success: false, + output: stdout, + errorOutput: stderr || 'Torrent file not found after generation. Check server logs for file listing.', + error: 'Torrent file not found' + }; + return NextResponse.json(response); + } + + } catch (error) { + console.error('Error creating torrent:', error); + const execError = error as ExecError; + return NextResponse.json({ + error: 'Failed to create torrent', + details: execError.message, + output: execError.stdout, + errorOutput: execError.stderr + }, { status: 500 }); + } +} diff --git a/app/api/upload/image/route.ts b/app/api/upload/image/route.ts new file mode 100644 index 0000000..1175aa1 --- /dev/null +++ b/app/api/upload/image/route.ts @@ -0,0 +1,48 @@ +import { NextResponse } from 'next/server'; + +export async function POST(request: Request) { + try { + const formData = await request.formData(); + const file = formData.get('file') as File | null; + + if (!file) { + return NextResponse.json({ error: 'No file provided' }, { status: 400 }); + } + + const apiKey = process.env.RED_IMAGE_API_KEY; + if (!apiKey) { + return NextResponse.json({ error: 'Server misconfiguration: No RED API Key' }, { status: 500 }); + } + + // RED image host requires 'file' POST argument for local file upload + const upstreamFormData = new FormData(); + upstreamFormData.append('file', file); + + const response = await fetch('https://redacted.sh/ajax.php?action=upload_image', { + method: 'POST', + headers: { + 'Authorization': apiKey, + }, + body: upstreamFormData, + }); + + if (!response.ok) { + throw new Error(`Upload failed with status: ${response.status}`); + } + + const data = await response.json(); + + if (data.status !== 'success' || !data.response || !data.response.url) { + throw new Error(data.error || data.status || 'Invalid response from RED image host'); + } + + const imageUrl = data.response.url; + + return NextResponse.json({ url: imageUrl }); + + } catch (error) { + console.error('RED image host upload error:', error); + const errorMessage = error instanceof Error ? error.message : 'Internal Server Error'; + return NextResponse.json({ error: errorMessage }, { status: 500 }); + } +} \ No newline at end of file diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..5cf0f57 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,144 @@ +@import "tailwindcss"; + +@plugin "tailwindcss-animate"; + +@custom-variant dark (&:is(.dark *)); + +@theme { + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.588 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + /* Darker background (Zinc 950ish) */ + --background: oklch(0.1 0 0); + --foreground: oklch(0.985 0 0); + + /* Slightly lighter card background (Zinc 900) */ + --card: oklch(0.14 0 0); + --card-foreground: oklch(0.985 0 0); + + --popover: oklch(0.14 0 0); + --popover-foreground: oklch(0.985 0 0); + + /* Primary color - maybe a vibrant purple/blue or just white for clean look? User said "Crossfade", maybe a gradient? + Let's stick to a clean white/gray primary for now, or a subtle accent. */ + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + + --secondary: oklch(0.2 0 0); + --secondary-foreground: oklch(0.985 0 0); + + --muted: oklch(0.2 0 0); + --muted-foreground: oklch(0.708 0 0); + + --accent: oklch(0.2 0 0); + --accent-foreground: oklch(0.985 0 0); + + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + + --border: oklch(0.2 0 0); + --input: oklch(0.2 0 0); + --ring: oklch(0.439 0 0); + + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..75afdb7 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,36 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +import { ToolChecker } from "@/components/tool-checker"; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..af00238 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,5 @@ +import Dashboard from "@/components/dashboard"; + +export default function Home() { + return ; +} diff --git a/components.json b/components.json new file mode 100644 index 0000000..b7b9791 --- /dev/null +++ b/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/components/album-selector.tsx b/components/album-selector.tsx new file mode 100644 index 0000000..1b2f40f --- /dev/null +++ b/components/album-selector.tsx @@ -0,0 +1,56 @@ +import { Disc, Music, ChevronRight } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { motion } from "motion/react"; +import { Album } from "@/types"; + +interface AlbumSelectorProps { + albums: Album[]; + selectedAlbum: Album | null; + onSelect: (album: Album) => void; +} + +export function AlbumSelector({ albums, selectedAlbum, onSelect }: AlbumSelectorProps) { + if (albums.length === 0) return null; + + return ( +
+ {albums.map((album, i) => ( + onSelect(album)} + className={cn( + "group cursor-pointer flex flex-col gap-3 relative", + selectedAlbum?.path === album.path ? "opacity-80" : "" + )} + > +
+ {album.coverPath ? ( + {album.name} + ) : ( +
+ +
+ )} +
+
+ +
+

+ {album.name} +

+

+ {album.path.split('/').pop()} +

+
+ + ))} +
+ ); +} diff --git a/components/album-view.tsx b/components/album-view.tsx new file mode 100644 index 0000000..b095b77 --- /dev/null +++ b/components/album-view.tsx @@ -0,0 +1,2344 @@ +import { useState, useEffect, useRef, useMemo } from "react"; +import { createPortal } from "react-dom"; +import { + Copy, + Check, + AlertTriangle, + FileAudio, + ShieldCheck, + ShieldAlert, + RefreshCw, + Trash2, + Download, + Activity, + FastForward, + Disc, + Upload, + X, + Waves, + HardDrive, + FileJson, + Magnet, + Play, + Link, +} from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Separator } from "@/components/ui/separator"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { Skeleton } from "@/components/ui/skeleton"; +import { motion } from "motion/react"; +import { RenameDialog } from "@/components/rename-dialog"; +import { + Album, + AnalysisResponse, + SpectrogramResponse, + TorrentCreationResponse, + CheckMQAResponse, + CheckUpconvResponse, + QbittorrentInjectResponse, + QbittorrentResumeResponse, + QbittorrentStatusResponse, + AnalysisTrack, +} from "@/types"; + +interface AlbumViewProps { + album: Album; + addLog: (msg: string) => void; + onReset: () => void; + onAlbumUpdate: (newPath?: string) => void; +} + +export function AlbumView({ + album, + addLog, + onReset, + onAlbumUpdate, +}: AlbumViewProps) { + const [loading, setLoading] = useState(false); + const [data, setData] = useState(null); + const [error, setError] = useState(null); + const [copied, setCopied] = useState(null); + const [sanitizing, setSanitizing] = useState(false); + const [sanitizeStatus, setSanitizeStatus] = useState< + "idle" | "success" | "error" + >("idle"); + + const [torrenting, setTorrenting] = useState(false); + const [torrentStatus, setTorrentStatus] = useState< + "idle" | "success" | "error" + >("idle"); + + const [checkingMQA, setCheckingMQA] = useState(false); + const [mqaStatus, setMqaStatus] = useState< + "idle" | "success" | "error" | "warning" + >("idle"); + + const [checkingUpconv, setCheckingUpconv] = useState(false); + const [upconvStatus, setUpconvStatus] = useState< + "idle" | "success" | "error" + >("idle"); + + const [uploadingCover, setUploadingCover] = useState(false); + const [coverUploadStatus, setCoverUploadStatus] = useState< + "idle" | "success" | "error" + >("idle"); + const [coverUrl, setCoverUrl] = useState(null); + + const [spectrograms, setSpectrograms] = useState< + Record + >({}); + const [previewUrl, setPreviewUrl] = useState(null); + const [showAllSpectrograms, setShowAllSpectrograms] = useState(false); + const [spectrogramsViewed, setSpectrogramsViewed] = useState(false); + + const [copying, setCopying] = useState(false); + const [copyStatus, setCopyStatus] = useState<"idle" | "success" | "error">( + "idle", + ); + const [deleting, setDeleting] = useState(false); + const [generatingTemplate, setGeneratingTemplate] = useState(false); + // Mock state for stepper visualization since we removed the real file generation + const [generatedFiles, setGeneratedFiles] = useState<{ + json: { name: string; url: string } | null; + torrent: { name: string; url: string } | null; + }>({ json: null, torrent: null }); + const [skippedSteps, setSkippedSteps] = useState>({}); + + const [injecting, setInjecting] = useState(false); + const [injectionStatus, setInjectionStatus] = useState< + "idle" | "injecting" | "checking" | "success" | "error" | "resumed" + >("idle"); + const [injectionHash, setInjectionHash] = useState(null); + const [recheckProgress, setRecheckProgress] = useState(0); + const [resuming, setResuming] = useState(false); + const [showRenameDialog, setShowRenameDialog] = useState(false); + + const [releaseType, setReleaseType] = useState(1); + const [isGuessedType, setIsGuessedType] = useState(false); + + const [preflightSkipped, setPreflightSkipped] = useState(false); + const [autoMode, setAutoMode] = useState(false); + const [autoModeStarted, setAutoModeStarted] = useState(false); + + // Audio Preview State + const [playingTrack, setPlayingTrack] = useState(null); + const [isPlaying, setIsPlaying] = useState(false); + const [progress, setProgress] = useState(0); + const [isDragging, setIsDragging] = useState(false); + const isDraggingRef = useRef(false); + const lastSeekTimeRef = useRef(0); + const audioRef = useRef(null); + const dragStartedRef = useRef(false); + const shouldSkipClickRef = useRef(false); + + useEffect(() => { + audioRef.current = new Audio(); + audioRef.current.volume = 0.5; + + const handleEnded = () => { + setIsPlaying(false); + setProgress(0); + setPlayingTrack(null); + }; + + const handleTimeUpdate = () => { + if (audioRef.current && !isDraggingRef.current) { + const duration = audioRef.current.duration; + const currentTime = audioRef.current.currentTime; + if (duration > 0) { + setProgress((currentTime / duration) * 100); + } + } + }; + + audioRef.current.addEventListener("ended", handleEnded); + audioRef.current.addEventListener("timeupdate", handleTimeUpdate); + + return () => { + if (audioRef.current) { + audioRef.current.pause(); + audioRef.current.removeEventListener("ended", handleEnded); + audioRef.current.removeEventListener("timeupdate", handleTimeUpdate); + } + }; + }, []); + + const togglePlay = (filename: string) => { + if (!audioRef.current) return; + + if (playingTrack === filename) { + if (isPlaying) { + audioRef.current.pause(); + setIsPlaying(false); + } else { + const playPromise = audioRef.current.play(); + if (playPromise !== undefined) { + playPromise + .then(() => setIsPlaying(true)) + .catch((e) => { + if (e.name === "AbortError") return; + console.error("Playback failed", e); + }); + } + } + } else { + // Stop previous if any + audioRef.current.pause(); + + // Play new + audioRef.current.src = `/api/audio?path=${encodeURIComponent(`${album.path}/${filename}`)}`; + const playPromise = audioRef.current.play(); + if (playPromise !== undefined) { + playPromise + .then(() => setIsPlaying(true)) + .catch((e) => { + if (e.name === "AbortError") return; + console.error("Playback failed", e); + addLog(`Playback failed: ${e.message}`); + setPlayingTrack(null); + setIsPlaying(false); + }); + } + setPlayingTrack(filename); + setProgress(0); + } + }; + + const handleSeek = (e: React.MouseEvent, filename: string) => { + if (playingTrack !== filename || !audioRef.current) return; + + const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); + const x = e.clientX - rect.left; + const width = rect.width; + const percentage = Math.max(0, Math.min(1, x / width)); + + // Update UI immediately + setProgress(percentage * 100); + + // Throttle audio seek to every 50ms + const now = Date.now(); + if (now - lastSeekTimeRef.current > 50) { + if (audioRef.current.duration) { + audioRef.current.currentTime = percentage * audioRef.current.duration; + } + lastSeekTimeRef.current = now; + } + }; + + const handleTrackMouseDown = (e: React.MouseEvent, filename: string) => { + if ((e.target as HTMLElement).closest("button")) return; + e.preventDefault(); // Prevent text selection + + dragStartedRef.current = false; + shouldSkipClickRef.current = false; + + if (playingTrack !== filename) { + togglePlay(filename); + shouldSkipClickRef.current = true; // We handled the action here, skip MouseUp toggle + } + setIsDragging(true); + isDraggingRef.current = true; + }; + + const handleTrackMouseMove = (e: React.MouseEvent, filename: string) => { + if (isDragging) { + dragStartedRef.current = true; + if (playingTrack === filename) { + handleSeek(e, filename); + } + } + }; + + const handleTrackMouseUp = (e: React.MouseEvent, filename: string) => { + if ((e.target as HTMLElement).closest("button")) return; + + setIsDragging(false); + isDraggingRef.current = false; + + if (!dragStartedRef.current) { + // It was a click + if (playingTrack === filename && !shouldSkipClickRef.current) { + togglePlay(filename); + } + } else { + // It was a drag, ensure final position is set + if (playingTrack === filename && audioRef.current) { + const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); + const x = e.clientX - rect.left; + const width = rect.width; + const percentage = Math.max(0, Math.min(1, x / width)); + if (audioRef.current.duration) { + audioRef.current.currentTime = percentage * audioRef.current.duration; + } + } + } + }; + + const handleTrackMouseLeave = () => { + setIsDragging(false); + isDraggingRef.current = false; + }; + + const handleUploadCover = async ( + isAutoMode: boolean | React.MouseEvent = false, + ) => { + const auto = isAutoMode === true; + if (!album.coverPath) return; + + if (coverUrl) { + if (!auto) copyToClipboard(coverUrl, "Cover URL"); + return; + } + + setUploadingCover(true); + addLog("Uploading cover art..."); + try { + // 1. Fetch the image blob from our local API + const coverRes = await fetch( + `/api/cover?path=${encodeURIComponent(album.coverPath)}`, + ); + const blob = await coverRes.blob(); + + // 2. Prepare form data + const formData = new FormData(); + formData.append("file", blob, "cover.jpg"); + + // 3. Upload to our proxy API + const res = await fetch("/api/upload/image", { + method: "POST", + body: formData, + }); + const result = (await res.json()) as { + error?: string; + url?: string; + }; + + if (result.url) { + setCoverUrl(result.url); + setCoverUploadStatus("success"); + if (!auto) copyToClipboard(result.url, "Cover URL"); + addLog(`Cover uploaded: ${result.url}`); + } else { + setCoverUploadStatus("error"); + addLog(`Upload failed: ${result.error}`); + } + } catch (e) { + setCoverUploadStatus("error"); + addLog("Upload request failed."); + } finally { + setUploadingCover(false); + } + }; + + // Track previous album path to handle resets correctly + const prevAlbumPathRef = useRef(null); + const preservedReleaseType = useRef(null); + const hasInitializedReleaseType = useRef(false); + const isSanitizingTransition = useRef(false); + + useEffect(() => { + if (album) { + analyzeAlbum(); + + // Only reset checks if we switched to a different album + if (prevAlbumPathRef.current !== album.path) { + // If this is a sanitization transition, we want to keep the release type and checks + if (isSanitizingTransition.current) { + isSanitizingTransition.current = false; + // We preserve preflight checks and release type + } else { + preservedReleaseType.current = null; + hasInitializedReleaseType.current = false; + + // Reset checks and state for a completely new album detection + setSpectrograms({}); + setMqaStatus("idle"); + setUpconvStatus("idle"); + setSpectrogramsViewed(false); + setPreflightSkipped(false); + setAutoModeStarted(false); + setAutoMode(false); + // Reset workflow steps + setSkippedSteps({}); + setSanitizeStatus("idle"); + setTorrentStatus("idle"); + setCopyStatus("idle"); + setCoverUploadStatus("idle"); + setGeneratedFiles({ json: null, torrent: null }); + setInjectionStatus("idle"); + setInjectionHash(null); + setCoverUrl(null); + } + } + prevAlbumPathRef.current = album.path; + } + }, [album]); + + useEffect(() => { + if (data && data.tracks) { + fetchSpectrograms(); + } + }, [data]); + + useEffect(() => { + if (data && data.metadata) { + if (data.metadata.releaseType) { + if (preservedReleaseType.current !== null) { + setReleaseType(preservedReleaseType.current); + hasInitializedReleaseType.current = true; + preservedReleaseType.current = null; + } else if (!hasInitializedReleaseType.current) { + setReleaseType(data.metadata.releaseType); + hasInitializedReleaseType.current = true; + if (data.metadata.releaseType !== 1) { + setIsGuessedType(true); + } + } + } + } + }, [data]); + + const fetchSpectrograms = async () => { + if (!data || !album) return; + try { + const res = await fetch("/api/spectrogram", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + albumPath: album.path, + tracks: data.tracks, + upc: data.metadata.upc, + }), + }); + const result = (await res.json()) as SpectrogramResponse; + if (result.results) { + console.log("Spectrograms loaded:", result.results); + setSpectrograms(result.results); + } + } catch (e) { + console.error("Failed to fetch spectrograms", e); + } + }; + + // Auto-refresh album details every 5 seconds to catch new files + useEffect(() => { + if (!album) return; + const interval = setInterval(() => { + // Silent update + fetch("/api/analyze", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }) + .then((res) => res.json()) + .then((result: AnalysisResponse & { error?: string }) => { + if (!result.error) { + // Only update if track count changed or filenames changed + setData((prev) => { + if (!prev) return result; + if (prev.tracks.length !== result.tracks.length) return result; + + const prevNames = prev.tracks + .map((t) => t.filename) + .sort() + .join("|"); + const newNames = result.tracks + .map((t) => t.filename) + .sort() + .join("|"); + if (prevNames !== newNames) return result; + + return prev; + }); + } + }) + .catch(() => {}); + }, 5000); + return () => clearInterval(interval); + }, [album]); + + // Polling for qBittorrent status + useEffect(() => { + if (injectionStatus !== "checking" || !injectionHash) return; + + const interval = setInterval(async () => { + try { + const res = await fetch( + `/api/qbittorrent/status?hash=${injectionHash}`, + ); + const result = (await res.json()) as QbittorrentStatusResponse & { + error?: string; + }; + + if (result.success && result.info) { + const { state, progress } = result.info; + + if (progress === 1) { + setInjectionStatus("success"); + setRecheckProgress(100); + addLog("Torrent recheck complete: 100%"); + } else if ( + state === "checkingUP" || + state === "checkingDL" || + state === "metaDL" || + state === "allocating" || + state === "queuedUP" || + state === "queuedDL" + ) { + setRecheckProgress(Math.round(progress * 100)); + } else if ( + state === "stoppedDL" || + state === "pausedDL" || + state === "stoppedUP" || + state === "pausedUP" + ) { + // If stopped and not 100%, it means recheck finished (or didn't find anything) + setInjectionStatus("error"); + addLog( + `Recheck finished with incomplete data (${Math.round(progress * 100)}%). Check path mapping.`, + ); + } else { + // Unknown state or other error + setInjectionStatus("error"); + addLog(`Injection failed. State: ${state}`); + } + } + } catch (e) { + console.error("Polling failed", e); + } + }, 1000); + + return () => clearInterval(interval); + }, [injectionStatus, injectionHash]); + + const analyzeAlbum = async () => { + if (!data) setLoading(true); + setError(null); + // setData(null); // Keep existing data to prevent flicker + addLog(`Analyzing album: ${album.name}...`); + try { + const res = await fetch("/api/analyze", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = (await res.json()) as AnalysisResponse & { + error?: string; + }; + if (result.error) { + setError(result.error); + addLog(`Error: ${result.error}`); + } else { + setData(result); + addLog(`Analysis complete. Status: ${result.quality.status}`); + + // Check for long filenames (Folder + / + File) + // We need to type guard tracks to ensure they are not error tracks for filename access + const hasLong = result.tracks.some((t) => { + if ("error" in t) return false; + return album.name.length + 1 + t.filename.length > 179; + }); + if (hasLong) { + setShowRenameDialog(true); + } + } + } catch (e) { + setError("Failed to connect to server"); + addLog("Failed to connect to server"); + } finally { + setLoading(false); + } + }; + + const copyToClipboard = (text: string, label: string) => { + navigator.clipboard.writeText(text); + setCopied(label); + setTimeout(() => setCopied(null), 2000); + addLog(`Copied ${label} to clipboard.`); + }; + + const handleSanitize = async () => { + setSanitizing(true); + setSanitizeStatus("idle"); + addLog("Sanitizing album..."); + try { + const res = await fetch("/api/sanitize", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = await res.json(); + if (result.success) { + setSanitizeStatus("success"); + addLog("Album sanitized successfully."); + + // Preserve release type across the reload + preservedReleaseType.current = releaseType; + + if (result.newAlbumPath && result.newAlbumPath !== album.path) { + isSanitizingTransition.current = true; + onAlbumUpdate(result.newAlbumPath); // Update parent with new path + } else { + onAlbumUpdate(); // Refresh album data + } + } else { + setSanitizeStatus("error"); + addLog(`Sanitize failed: ${result.error}`); + } + } catch (e) { + setSanitizeStatus("error"); + addLog("Sanitize request failed."); + } finally { + setSanitizing(false); + } + }; + + const handleTorrent = async () => { + setTorrenting(true); + setTorrentStatus("idle"); + addLog("Creating torrent..."); + try { + const res = await fetch("/api/torrent", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = (await res.json()) as TorrentCreationResponse; + if (result.success) { + setTorrentStatus("success"); + addLog("Torrent created successfully."); + if (result.output) addLog(result.output); + } else { + setTorrentStatus("error"); + addLog(`Torrent creation failed: ${result.error}`); + if (result.errorOutput) addLog(result.errorOutput); + } + } catch (e) { + setTorrentStatus("error"); + addLog("Torrent request failed."); + } finally { + setTorrenting(false); + } + }; + + const handleCheckMQA = async () => { + if (!data?.tracks?.length) return; + setCheckingMQA(true); + setMqaStatus("idle"); + addLog("Checking for MQA..."); + + try { + const res = await fetch("/api/check/mqa", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = (await res.json()) as CheckMQAResponse & { + error?: string; + }; + if (result.success) { + if (result.isMQA) { + setMqaStatus("warning"); + addLog("WARNING: MQA DETECTED!"); + if ( + confirm("MQA Detected! Do you want to delete this album and reset?") + ) { + addLog( + "User requested delete (Not implemented in MVP, please delete manually).", + ); + } + } else { + setMqaStatus("success"); + addLog("MQA Check Passed: No MQA detected."); + } + } else { + setMqaStatus("error"); + addLog(`MQA Check failed: ${result.error}`); + } + } catch (e) { + setMqaStatus("error"); + addLog("MQA Check request failed."); + } finally { + setCheckingMQA(false); + // setTimeout(() => setMqaStatus("idle"), 5000); // Removed auto-reset + } + }; + + const handleCheckUpconv = async () => { + if (!data?.tracks?.length) return; + setCheckingUpconv(true); + setUpconvStatus("idle"); + addLog("Checking for Upconversion..."); + const has24Bit = data.tracks.some((t) => { + if ("error" in t) return false; + return (t.format?.bitsPerSample || 0) >= 24; + }); + if (!has24Bit) { + addLog("No 24-bit files to check."); + setCheckingUpconv(false); + return; + } + + try { + const res = await fetch("/api/check/upconv", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = (await res.json()) as CheckUpconvResponse & { + error?: string; + }; + if (result.success) { + setUpconvStatus("success"); + addLog(`Upconversion Check: ${result.wastedBits}`); + addLog(result.output); + } else { + setUpconvStatus("error"); + addLog(`Upconversion Check failed: ${result.error}`); + } + } catch (e) { + setUpconvStatus("error"); + addLog("Upconversion Check request failed."); + } finally { + setCheckingUpconv(false); + // setTimeout(() => setUpconvStatus("idle"), 5000); // Removed auto-reset + } + }; + + const handleInject = async (eOrRetryCount?: React.MouseEvent | number) => { + const retryCount = typeof eOrRetryCount === "number" ? eOrRetryCount : 0; + + if (retryCount === 0) { + setInjecting(true); + setInjectionStatus("injecting"); + addLog("Injecting torrent to qBittorrent..."); + } + + try { + const res = await fetch("/api/qbittorrent/inject", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = (await res.json()) as QbittorrentInjectResponse & { + error?: string; + }; + + if (result.success) { + setInjectionHash(result.hash); + addLog( + `Torrent injected${retryCount > 0 ? ` (after ${retryCount} retries)` : ""}. Waiting for client to register...`, + ); + // Wait 2 seconds before starting recheck loop to allow qBit to register the torrent + setTimeout(() => { + setInjectionStatus("checking"); + addLog("Starting recheck..."); + setInjecting(false); + }, 4000); + } else { + if (retryCount < 3) { + addLog(`Injection failed. Retrying... (${retryCount + 1}/3)`); + setTimeout(() => handleInject(retryCount + 1), 2000); + } else { + setInjectionStatus("error"); + addLog(`Injection failed after 3 retries: ${result.error}`); + setInjecting(false); + } + } + } catch (e) { + if (retryCount < 3) { + addLog(`Injection request failed. Retrying... (${retryCount + 1}/3)`); + setTimeout(() => handleInject(retryCount + 1), 2000); + } else { + setInjectionStatus("error"); + addLog("Injection request failed after 3 retries."); + setInjecting(false); + } + } + }; + + const handleCopy = async () => { + setCopying(true); + addLog("Copying album to output directory..."); + try { + const res = await fetch("/api/copy", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath: album.path }), + }); + const result = await res.json(); + if (result.success) { + addLog(`Album copied to: ${result.destPath}`); + setCopyStatus("success"); + } else { + addLog(`Copy failed: ${result.error}`); + setCopyStatus("error"); + } + } catch (e) { + addLog("Copy request failed."); + setCopyStatus("error"); + } finally { + setCopying(false); + } + }; + + // Auto Workflow effect + useEffect(() => { + if (!autoMode) return; + if ( + loading || + sanitizing || + torrenting || + copying || + uploadingCover || + injecting || + injectionStatus === "checking" || + injectionStatus === "injecting" + ) + return; + if (isSanitizingTransition.current) return; + + const timer = setTimeout(() => { + if (sanitizeStatus !== "success" && !skippedSteps[1]) { + handleSanitize(); + } else if (torrentStatus !== "success" && !skippedSteps[2]) { + handleTorrent(); + } else if (copyStatus !== "success" && !skippedSteps[3]) { + handleCopy(); + } else if (!coverUrl && !skippedSteps[4] && album.coverPath) { + handleUploadCover(true); + } else if ( + injectionStatus !== "success" && + injectionStatus !== "resumed" && + !skippedSteps[5] + ) { + handleInject(0); + } else { + setAutoMode(false); + addLog("Auto workflow completed."); + } + }, 500); + + return () => clearTimeout(timer); + }, [ + autoMode, + sanitizeStatus, + torrentStatus, + copyStatus, + coverUrl, + injectionStatus, + skippedSteps, + sanitizing, + torrenting, + copying, + uploadingCover, + injecting, + loading, + album.path, + ]); + + const handleResume = async () => { + if (!injectionHash) return; + setResuming(true); + addLog("Resuming torrent..."); + + try { + const res = await fetch("/api/qbittorrent/resume", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ hash: injectionHash }), + }); + const result = (await res.json()) as QbittorrentResumeResponse & { + error?: string; + }; + + if (result.success) { + setInjectionStatus("resumed"); + addLog("Torrent resumed successfully."); + } else { + addLog(`Resume failed: ${result.error}`); + } + } catch (e) { + addLog("Resume request failed."); + } finally { + setResuming(false); + } + }; + + const handleSkipPreflight = () => { + if ( + confirm( + "WARNING: Skipping these checks is UNSAFE. You might upload bad files or break the workflow. Are you sure you want to skip?", + ) + ) { + setPreflightSkipped(true); + addLog("WARNING: Pre-flight checks skipped by user."); + } + }; + + const audioTriggers = useMemo( + () => [ + { + sound: "/sfx/error.mp3", + conditions: [ + !!error, + data?.quality?.status === "CORRUPT", + showRenameDialog, + sanitizeStatus === "error", + torrentStatus === "error", + copyStatus === "error", + coverUploadStatus === "error", + injectionStatus === "error", + mqaStatus === "error", + mqaStatus === "warning", + upconvStatus === "error", + ], + }, + { + sound: "/sfx/stage-complete.mp3", + conditions: [ + sanitizeStatus === "success", + torrentStatus === "success", + copyStatus === "success", + coverUploadStatus === "success", + injectionStatus === "checking", + mqaStatus === "success", + upconvStatus === "success", + ], + }, + { + sound: "/sfx/success.mp3", + conditions: [injectionStatus === "success"], + }, + ], + [ + error, + data?.quality?.status, + showRenameDialog, + sanitizeStatus, + torrentStatus, + copyStatus, + coverUploadStatus, + injectionStatus, + mqaStatus, + upconvStatus, + ], + ); + + const prevTriggersRef = useRef([]); + + useEffect(() => { + if (prevTriggersRef.current.length === 0) { + prevTriggersRef.current = audioTriggers.map((t) => + t.conditions.map(() => false), + ); + } + + audioTriggers.forEach((trigger, i) => { + const prevConditions = prevTriggersRef.current[i] || []; + + // Trigger if condition goes explicitly from falsy to truthy + const justFired = trigger.conditions.some( + (cond, j) => cond && !prevConditions[j], + ); + + if (justFired) { + new Audio(trigger.sound).play().catch(console.error); + } + + prevTriggersRef.current[i] = [...trigger.conditions]; + }); + }, [audioTriggers]); + + const backgroundCoverMemo = useMemo(() => { + return album.coverPath ? ( + <> +
+
+ {album.name} +
+ + ) : null; + }, [album.coverPath, album.name]); + + const spectrogramsMemo = useMemo(() => { + if (!data?.tracks) return null; + return data.tracks.map((track: AnalysisTrack) => { + const spec = spectrograms[track.filename]; + if (!spec?.exists || !spec.url) return null; + + return ( +
+
+
+ + {(!("error" in track) && track.common?.track?.no) || ""} + + + {(!("error" in track) && track.common?.title) || track.filename} + +
+ {!("error" in track) && ( +
+ {track.format?.bitsPerSample}bit /{" "} + {track.format?.sampleRate + ? track.format.sampleRate / 1000 + : "?"} + kHz +
+ )} +
+
+
+ {`Spectrogram +
+
+ ); + }); + }, [data?.tracks, spectrograms]); + + if (loading) { + return ( +
+
+ + +
+ + + +
+
+
+ ); + } + + if (error) { + return ( +
+ +

{error}

+ +
+ ); + } + + if (!data) return null; + + const { metadata, tracks, quality } = data; + const tracklistText = tracks + .map((t) => { + if ("error" in t) return `${t.filename} (Error)`; + return `${t.common?.track?.no || "00"} - ${t.common?.title || t.filename}`; + }) + .join("\n"); + + // Dynamic offset deduction for Tracklist Max Height + const isLogEnabled = process.env.NEXT_PUBLIC_SHOW_SYSTEM_LOG === "true"; + const tracklistOffsetRem = isLogEnabled ? 42 : 28; + + // Check relative length: Folder Name + / + File Name + const hasLongFilenames = tracks.some((t) => { + if ("error" in t) return false; + return album.name.length + 1 + t.filename.length > 179; + }); + const has24Bit = tracks.some((t) => { + if ("error" in t) return false; + return (t.format?.bitsPerSample || 0) >= 24; + }); + + // Pre-flight checks validation + const mqaPassed = mqaStatus === "success"; + const upconvPassed = !has24Bit || upconvStatus === "success"; + const specsExist = Object.keys(spectrograms).length > 0; + const specsPassed = !specsExist || spectrogramsViewed; + const allChecksPassed = + preflightSkipped || (mqaPassed && upconvPassed && specsPassed); + + const releaseTypes = [ + { id: 1, name: "Album" }, + { id: 3, name: "Soundtrack" }, + { id: 5, name: "EP" }, + { id: 6, name: "Anthology" }, + { id: 7, name: "Compilation" }, + { id: 9, name: "Single" }, + { id: 11, name: "Live album" }, + { id: 13, name: "Remix" }, + { id: 14, name: "Bootleg" }, + { id: 15, name: "Interview" }, + { id: 16, name: "Mixtape" }, + { id: 17, name: "DJ Mix" }, + { id: 18, name: "Concert recording" }, + { id: 21, name: "Unknown" }, + ]; + + return ( +
+ {/* Header Section */} +
+ {backgroundCoverMemo} +
+ {/* Cover Art */} +
+
+ {album.coverPath ? ( + {album.name} + ) : ( +
+ +
+ )} +
+ {/* Glow effect behind cover */} +
+
+ + {/* Info */} +
+
+ + {metadata.album} + + + + {metadata.artist} + + +
+ + {/* Metadata Grid */} + + + {quality.status} + + + {quality.mixed && ( + + MIXED FORMATS + + )} + + {metadata.year &&
} + + {metadata.year && ( + copyToClipboard(String(metadata.year), "Year")} + title="Copy Year" + > + {metadata.year} + + )} + + {metadata.totalSize && ( + <> +
+ + copyToClipboard( + formatBytes(metadata.totalSize), + "Total Size", + ) + } + title="Copy Total Size" + > + {formatBytes(metadata.totalSize)} + + + )} + + {metadata.label && ( + <> +
+ copyToClipboard(metadata.label, "Label")} + title="Copy Label" + > + {metadata.label} + + + )} + + {metadata.upc && ( + <> +
+ copyToClipboard(metadata.upc || "", "UPC")} + title="Copy UPC" + > + UPC: {metadata.upc} + + + )} + + + {/* Additional Artists */} + {metadata.additionalArtists && ( + + + Feat + + {metadata.additionalArtists.map((artist: string, i: number) => ( + copyToClipboard(artist, "Artist Name")} + > + {artist} + + ))} + + )} + + {/* Release Type & Links */} +
+
+ +
+ + + +
+
+ + {isGuessedType && ( + + Auto-detected + + )} + + {metadata.tidalUrl && ( + + )} +
+
+
+
+ + + +
+ {/* Tracklist Column */} +
+ {quality.mixed && ( + + + + Quality Mismatch + + + Different bit depths/sample rates detected. + + + + )} + + {hasLongFilenames && ( + + + + Filename Too Long + + + Some filenames exceed 179 characters. Torrent creation is + disabled. + + + )} + +
+
+

+ Tracklist +

+
+ + +
+
+
+
+
+ {tracks.map((track: AnalysisTrack, i: number) => { + const isError = "error" in track; + return ( + + handleTrackMouseDown(e, track.filename) + } + onMouseMove={(e) => + handleTrackMouseMove(e, track.filename) + } + onMouseUp={(e) => handleTrackMouseUp(e, track.filename)} + onMouseLeave={handleTrackMouseLeave} + > + {/* Progress Bar */} + {playingTrack === track.filename && ( +
+ )} + +
+ + {isError + ? "!!" + : (track.common?.track?.no || i + 1) + .toString() + .padStart(2, "0")} + +
+ + + {track.filename} + +
+
+
+ {!isError && ( +
+ + {track.format?.bitsPerSample}bit/ + {track.format?.sampleRate + ? track.format.sampleRate / 1000 + : "?"} + kHz + + {process.env.NEXT_PUBLIC_SHOW_TRACK_BITRATE === + "true" && ( + + {Math.round( + (track.format?.bitrate || 0) / 1000, + )} + kbps + + )} +
+ )} + {/* Spectrogram Button */} + +
+ + ); + })} +
+
+
+
+
+ + {/* Actions Column */} +
+ {/* Quality Checks - Now Pre-flight */} +
+ {!allChecksPassed && ( +
+ )} +
+

+ Pre-flight Checks +

+
+ {!allChecksPassed && ( + + )} +
+ {mqaStatus === "success" && ( +
+ )} + {upconvStatus === "success" && ( +
+ )} + {specsPassed && specsExist && ( +
+ )} +
+
+
+
+ + + {has24Bit && ( + + )} + + +
+
+ + {/* Release Workflow Stepper */} +
+
+

+ Release Workflow +

+ {(!( + sanitizeStatus !== "idle" || + torrentStatus !== "idle" || + copyStatus !== "idle" || + uploadingCover || + !!coverUrl || + injectionStatus !== "idle" || + Object.keys(skippedSteps).length > 0 + ) || + autoModeStarted) && ( + + )} +
+
+ {/* Vertical Line */} +
+ + {/* Step 1: Sanitize */} + setSkippedSteps((prev) => ({ ...prev, 1: true }))} + icon={} + actionLabel="Sanitize" + disabled={!allChecksPassed} + allChecksPassed={allChecksPassed} + /> + + {/* Step 2: Create Torrent */} + setSkippedSteps((prev) => ({ ...prev, 2: true }))} + icon={} + actionLabel="Create Torrent" + disabled={hasLongFilenames} + allChecksPassed={allChecksPassed} + /> + + {/* Step 3: Copy/Finalize */} + setSkippedSteps((prev) => ({ ...prev, 3: true }))} + icon={} + actionLabel="Copy to Output" + allChecksPassed={allChecksPassed} + /> + + {/* Step 4: Cover Art */} + setSkippedSteps((prev) => ({ ...prev, 4: true }))} + icon={} + actionLabel="Upload Cover" + disabled={!album.coverPath} + allChecksPassed={allChecksPassed} + /> + + {/* Step 5: Inject */} + setSkippedSteps((prev) => ({ ...prev, 5: true }))} + icon={} + actionLabel={ + injectionStatus === "checking" + ? `Checking ${recheckProgress}%` + : "Inject" + } + disabled={injectionStatus === "checking"} + allChecksPassed={allChecksPassed} + /> + + {/* Step 6: RED Template */} + { + setGeneratingTemplate(true); + addLog("Generating RED upload template..."); + try { + const res = await fetch("/api/red-template", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + albumPath: album.path, + releaseType: releaseType, + }), + }); + const result = await res.json(); + if (result.response) { + if (coverUrl) { + if (!result.response.group) result.response.group = {}; + result.response.group.wikiImage = coverUrl; + } + const jsonString = JSON.stringify(result, null, 4); + await navigator.clipboard.writeText(jsonString); + // Mocking the generated file state for the stepper visual + setGeneratedFiles((prev) => ({ + ...prev, + json: { name: "Template", url: "" }, + })); + addLog("Template copied to clipboard!"); + } else { + addLog(`Template generation failed: ${result.error}`); + } + } catch (e) { + addLog("Template request failed."); + } finally { + setGeneratingTemplate(false); + } + }} + onSkip={() => setSkippedSteps((prev) => ({ ...prev, 6: true }))} + icon={} + actionLabel="Copy Template" + allChecksPassed={allChecksPassed} + allowCompletedClick={true} + /> + + {/* Info Message */} + {(generatedFiles.json || skippedSteps[6]) && + injectionStatus !== "resumed" && ( +
+

Ready to Upload!

+

You can now finalise the upload on RED.

+

Return here and resume when ready.

+
+ )} + + {/* Step 7: Resume */} + setSkippedSteps((prev) => ({ ...prev, 7: true }))} + icon={} + actionLabel="Resume Torrent" + disabled={ + resuming || + (injectionStatus !== "success" && !skippedSteps[5]) + } + allChecksPassed={allChecksPassed} + /> +
+
+ + { + setDeleting(true); + addLog("Deleting album..."); + try { + const res = await fetch("/api/delete", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + albumPath: album.path, + upc: data.metadata.upc, + }), + }); + const result = await res.json(); + if (result.success) { + addLog("Album deleted successfully."); + // Trigger a rescan to update the list + await fetch("/api/scan", { method: "POST" }); + // Redirect to home + window.location.href = "/"; + } else { + addLog(`Delete failed: ${result.error}`); + setDeleting(false); + } + } catch (e) { + addLog("Delete request failed."); + setDeleting(false); + } + }} + disabled={deleting} + className="w-full justify-start h-10 text-sm transition-all bg-red-500/10 hover:bg-red-500/20 text-red-400 border border-red-500/20 relative overflow-hidden" + > + {deleting ? ( + + ) : ( + + )} + + {deleting ? "Deleting..." : "Hold to Delete"} + + +
+
+ + {previewUrl && + createPortal( +
setPreviewUrl(null)} + > +
e.stopPropagation()} + > + Spectrogram + +
+
, + document.body, + )} + + {showAllSpectrograms && + createPortal( +
setShowAllSpectrograms(false)} + > +
e.stopPropagation()} + > + {/* Header */} +
+
+
+ +
+
+

+ Album Spectrograms +

+

+ {tracks.length} tracks generated +

+
+
+ +
+ + {/* Content */} +
+ {spectrogramsMemo} + {Object.keys(spectrograms).length === 0 && ( +
+ +

No spectrograms generated yet.

+
+ )} +
+
+
, + document.body, + )} + + { + addLog("Renamed files successfully."); + analyzeAlbum(); // Re-analyze to update UI + }} + /> +
+ ); +} + +interface WorkflowStepProps { + number: number; + title: string; + description: string; + status: + | "skipped" + | "completed" + | "error" + | "loading" + | "pending" + | "reloading"; + isActive: boolean; + onClick: () => void; + onSkip?: () => void; + icon: React.ReactNode; + actionLabel: string; + disabled?: boolean; + allChecksPassed?: boolean; + allowCompletedClick?: boolean; +} + +function WorkflowStep({ + number, + title, + description, + status, + isActive, + onClick, + onSkip, + icon, + actionLabel, + disabled, + allChecksPassed, + allowCompletedClick, +}: WorkflowStepProps) { + return ( +
+ {/* Circle */} +
+ {status === "completed" || status === "reloading" ? ( + + ) : status === "skipped" ? ( + + ) : status === "error" ? ( + + ) : status === "loading" ? ( + + ) : ( + {number} + )} +
+ + {/* Content */} +
+
+
+

+ {title} +

+

{description}

+
+ {isActive && onSkip && allChecksPassed && ( + + )} +
+ + {(isActive || + status === "loading" || + status === "reloading" || + status === "error" || + (status === "completed" && allowCompletedClick)) && ( + + + + )} +
+
+ ); +} + +function ScrollableTrackName({ + text, + isError, +}: { + text: string; + isError: boolean; +}) { + const [isHovered, setIsHovered] = useState(false); + const containerRef = useRef(null); + const textRef = useRef(null); + const [scrollDistance, setScrollDistance] = useState(0); + const [duration, setDuration] = useState(0); + + useEffect(() => { + if (containerRef.current && textRef.current) { + const containerWidth = containerRef.current.offsetWidth; + const textWidth = textRef.current.offsetWidth; + + if (textWidth > containerWidth) { + const distance = textWidth - containerWidth + 20; // Add some padding + setScrollDistance(distance); + setDuration(distance * 0.05); // Adjust speed (seconds per pixel) + } else { + setScrollDistance(0); + } + } + }, [text]); + + return ( +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + 0 ? { x: -scrollDistance } : { x: 0 } + } + transition={{ + type: "spring", + stiffness: 100, + damping: 100, + + repeatType: "mirror", + repeatDelay: 1, + }} + style={{ x: 0 }} + > + {text} + +
+ ); +} + +function HoldButton({ onComplete, disabled, className, children }: any) { + const [holding, setHolding] = useState(false); + const [progress, setProgress] = useState(0); + const intervalRef = useRef(null); + + const startHold = () => { + if (disabled) return; + setHolding(true); + setProgress(0); + const startTime = Date.now(); + const envDuration = process.env.NEXT_PUBLIC_DELETE_HOLD_TIME_MS + ? parseInt(process.env.NEXT_PUBLIC_DELETE_HOLD_TIME_MS) + : 1500; + const duration = isNaN(envDuration) ? 1500 : envDuration; + + intervalRef.current = setInterval(() => { + const elapsed = Date.now() - startTime; + const newProgress = Math.min((elapsed / duration) * 100, 100); + setProgress(newProgress); + + if (newProgress >= 100) { + if (intervalRef.current) clearInterval(intervalRef.current); + setHolding(false); + setProgress(0); + onComplete(); + } + }, 16); + }; + + const stopHold = () => { + if (intervalRef.current) clearInterval(intervalRef.current); + setHolding(false); + setProgress(0); + }; + + return ( + + ); +} + +function formatBytes(bytes: number, decimals = 2) { + if (!+bytes) return "0 Bytes"; + + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + + // Start from MB (index 1) as audio albums are rarely just bytes or KB in these contexts, + // but generic logic is fine. FLAC albums are usually MB or GB. + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`; +} diff --git a/components/dashboard.tsx b/components/dashboard.tsx new file mode 100644 index 0000000..2486fc2 --- /dev/null +++ b/components/dashboard.tsx @@ -0,0 +1,312 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { FolderOpen, RefreshCw, Disc, Music, ArrowLeft, Trash2, Search, Waves } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { AlbumSelector } from "@/components/album-selector"; +import { AlbumView } from "@/components/album-view"; +import { StatusLog } from "@/components/status-log"; +import { AudioWave } from "@/components/ui/audio-wave"; +import { TidalSearch } from "@/components/tidal-search"; +import { motion, AnimatePresence } from "motion/react"; +import { Album } from "@/types"; + +export default function Dashboard() { + const [albums, setAlbums] = useState([]); + const [selectedAlbum, setSelectedAlbum] = useState(null); + const [loading, setLoading] = useState(false); + const [logs, setLogs] = useState([]); + const [view, setView] = useState<"idle" | "selection" | "details" | "tidal">("idle"); + + const addLog = (message: string) => { + setLogs((prev) => { + const newLogs = [...prev, `[${new Date().toLocaleTimeString()}] ${message}`]; + if (newLogs.length > 50) return newLogs.slice(newLogs.length - 50); + return newLogs; + }); + }; + + const scanWatchFolder = async (preserveView = false) => { + setLoading(true); + addLog("Scanning watch folder..."); + try { + const res = await fetch("/api/scan"); + const data = await res.json(); + if (data.albums) { + setAlbums(data.albums); + addLog(`Found ${data.albums.length} albums.`); + + if (!preserveView) { + if (data.albums.length > 0) { + setView("selection"); + } else { + setView("idle"); + } + } + } + } catch (error) { + addLog("Error scanning watch folder."); + console.error(error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + scanWatchFolder(); + }, []); + + // Auto-refresh watch folder + useEffect(() => { + const interval = setInterval(() => { + // Silent scan - don't show loading spinner for auto-refresh + fetch("/api/scan") + .then(res => res.json()) + .then((data: { albums: Album[] }) => { + if (data.albums) { + // Only update if count changed or deep comparison (simplified here by length/names check) + setAlbums(prev => { + const prevNames = prev.map(a => a.path).sort().join(','); + const newNames = data.albums.map((a) => a.path).sort().join(','); + if (prevNames !== newNames) { + addLog(`Watch folder updated: ${data.albums.length} albums found.`); + return data.albums; + } + // Even if list didn't change structure, update to get new cover paths if they appeared + // But we need to be careful not to cause re-renders if nothing changed. + // Let's check if any coverPath changed for the selected album + return data.albums; + }); + + // Sync selectedAlbum with new data to ensure cover art updates + if (selectedAlbum) { + const updatedSelected = data.albums.find((a) => a.path === selectedAlbum.path); + if (updatedSelected && updatedSelected.coverPath !== selectedAlbum.coverPath) { + setSelectedAlbum(updatedSelected); + } + } + + // If we are in idle view and albums appear, switch to selection + if (view === "idle" && data.albums.length > 0) { + setView("selection"); + } + + // If we are in selection view and albums disappear, switch to idle. + // However, if we are in TIDAL view, we shouldn't force switch back. + if (view === "selection" && data.albums.length === 0) { + setView("idle"); + } + } + }) + .catch(err => console.error("Auto-scan failed", err)); + }, 1000); + + return () => clearInterval(interval); + }, [view, selectedAlbum]); + + const handleAlbumUpdate = async (newPath?: string) => { + await scanWatchFolder(true); + if (newPath) { + const name = newPath.split('/').pop() || ""; + if (selectedAlbum) { + setSelectedAlbum({ ...selectedAlbum, path: newPath, name }); + } + } + }; + + const handleSelectAlbum = (album: Album) => { + setSelectedAlbum(album); + setView("details"); + }; + + const handleBack = () => { + setSelectedAlbum(null); + setView(albums.length > 0 ? "selection" : "idle"); + }; + + return ( +
+ {/* Header */} +
+
+ + + +

+ crossfade +

+
+
+ {view === "details" && ( + + )} + {view === "tidal" ? ( + + ) : ( + + )} + + + +
+
+ + {/* Main Content Area */} +
+ + {view === "idle" && ( + +
+
+ +
+
+

Waiting for Music

+

+ Place albums in the watch folder to begin. +

+
+ + )} + + {view === "selection" && ( + +
+
+

+ + Select Album +

+

+ Found {albums.length} albums ready for processing +

+
+ +
+ +
+
+
+
+ )} + + {view === "tidal" && ( + +
+
+

+ + TIDAL Search +

+

+ Search and copy links from TIDAL +

+
+ +
+ +
+
+
+
+ )} + + {view === "details" && selectedAlbum && ( + +
+ +
+
+ )} + +
+ + {/* Status Log */} + {process.env.NEXT_PUBLIC_SHOW_SYSTEM_LOG === "true" && ( +
+ +
+ )} +
+ ); +} diff --git a/components/rename-dialog.tsx b/components/rename-dialog.tsx new file mode 100644 index 0000000..ecbf24f --- /dev/null +++ b/components/rename-dialog.tsx @@ -0,0 +1,161 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { AlertTriangle, ArrowRight, Check, X } from "lucide-react"; +import { Badge } from "@/components/ui/badge"; +import { RenameProposal, ProposeRenameResponse, BatchRenameResponse } from "@/types"; + +interface RenameDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + albumPath: string; + onRenameComplete: () => void; +} + +export function RenameDialog({ open, onOpenChange, albumPath, onRenameComplete }: RenameDialogProps) { + const [loading, setLoading] = useState(false); + const [proposals, setProposals] = useState([]); + const [allFiles, setAllFiles] = useState([]); + const [applyToAll, setApplyToAll] = useState(true); + const [maxFileLength, setMaxFileLength] = useState(0); + const [selectedStrategy, setSelectedStrategy] = useState<"remove_brackets" | "remove_parens" | "remove_both" | "truncate">("remove_both"); + const [renaming, setRenaming] = useState(false); + + useEffect(() => { + if (open && albumPath) { + fetchProposals(); + } + }, [open, albumPath]); + + const fetchProposals = async () => { + setLoading(true); + try { + const res = await fetch("/api/propose-rename", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath }), + }); + const data = await res.json() as ProposeRenameResponse; + if (data.success) { + setProposals(data.problematicFiles); + setAllFiles(data.allFiles || []); + setMaxFileLength(data.maxFileLength); + } + } catch (e) { + console.error("Failed to fetch proposals", e); + } finally { + setLoading(false); + } + }; + + const handleRename = async () => { + setRenaming(true); + try { + const activeProposals = applyToAll ? allFiles : proposals; + const renames = activeProposals.map(p => ({ + original: p.original, + newName: p.strategies[selectedStrategy] || p.strategies.truncate // Fallback to truncate if strategy returns null (shouldn't happen for truncate) + })); + + const res = await fetch("/api/batch-rename", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ albumPath, renames }), + }); + const result = await res.json() as BatchRenameResponse; + + if (result.success) { + onRenameComplete(); + onOpenChange(false); + } else { + alert(`Rename failed: ${result.errors?.join(', ')}`); + } + } catch (e) { + alert("Rename request failed"); + } finally { + setRenaming(false); + } + }; + + const getPreview = (proposal: RenameProposal) => { + const newName = proposal.strategies[selectedStrategy]; + if (!newName) return Strategy not applicable (still too long); + return {newName}; + }; + + return ( + + + + + + Long Filenames Detected + + + The following files exceed the maximum allowed length ({maxFileLength} characters). + Please select a renaming strategy to fix them. + + + +
+ setSelectedStrategy(v as "remove_brackets" | "remove_parens" | "remove_both" | "truncate")} className="flex-1 flex flex-col min-h-0"> + + Remove [] + Remove () + Remove Both + Smart Truncate + + +
+ +
+
+ +
+ {(applyToAll ? allFiles : proposals).map((p, i) => ( +
+
+ {p.original} + {p.original.length} +
+ +
+ {getPreview(p)} + {p.strategies[selectedStrategy] && ( + + {p.strategies[selectedStrategy]!.length} + + )} +
+
+ ))} +
+
+
+
+
+ + + + + +
+
+ ); +} diff --git a/components/status-log.tsx b/components/status-log.tsx new file mode 100644 index 0000000..49f77ce --- /dev/null +++ b/components/status-log.tsx @@ -0,0 +1,46 @@ +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Terminal } from "lucide-react"; +import { useEffect, useRef } from "react"; +import { motion, AnimatePresence } from "motion/react"; + +interface StatusLogProps { + logs: string[]; +} + +export function StatusLog({ logs }: StatusLogProps) { + const scrollRef = useRef(null); + + // Auto-scroll to bottom when logs change + useEffect(() => { + if (scrollRef.current) { + scrollRef.current.scrollIntoView({ behavior: "smooth" }); + } + }, [logs]); + + return ( +
+
+ + System Log +
+ +
+ + {logs.map((log, i) => ( + + {">"} + {log} + + ))} + +
+
+ +
+ ); +} diff --git a/components/tidal-search.tsx b/components/tidal-search.tsx new file mode 100644 index 0000000..f05430a --- /dev/null +++ b/components/tidal-search.tsx @@ -0,0 +1,388 @@ +import { Search, Loader2, Music, Clock, Copy, Filter, ExternalLink } from "lucide-react"; +import { useState, useRef, useEffect } from "react"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { cn } from "@/lib/utils"; +import { motion, AnimatePresence } from "framer-motion"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Badge } from "@/components/ui/badge"; +import { toast } from "sonner"; + +interface Album { + id: string; + title: string; + artists: { name: string }[]; + duration: number; + url: string; + imageCover?: { url: string; width: number; height: number }[]; + mediaTags?: string[]; + releaseDate?: string; +} + +export function TidalSearch() { + const [query, setQuery] = useState(""); + const [results, setResults] = useState([]); + const [loading, setLoading] = useState(false); + const [sortBy, setSortBy] = useState<"relevance" | "duration" | "year">("relevance"); + const [filterQuality, setFilterQuality] = useState<"all" | "hires" | "lossless">("all"); + const [countryCode, setCountryCode] = useState("US"); + const [copiedId, setCopiedId] = useState(null); + const timeoutRef = useRef(null); + + // Initial load + useEffect(() => { + return () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + }; + }, []); + + async function handleSearch() { + if (!query.trim()) return; + setLoading(true); + setResults([]); + + try { + const res = await fetch(`/api/tidal/search?query=${encodeURIComponent(query)}&countryCode=${countryCode}`); + const data = await res.json(); + + if (data && data.albums) { + setResults(data.albums); + } else if (data && Array.isArray(data)) { + setResults(data); + } else { + console.warn("Unexpected API response structure:", data); + } + + } catch (error) { + console.error("Search failed:", error); + toast.error("Search failed. Please try again."); + } finally { + setLoading(false); + } + } + + const filteredResults = results.filter(album => { + if (filterQuality === "all") return true; + if (!album.mediaTags) return false; + if (filterQuality === "hires") { + return album.mediaTags.includes("HIRES_LOSSLESS"); + } + if (filterQuality === "lossless") { + // Exclusive filter: Must be Lossless AND NOT Hi-Res/MQA + const isHires = album.mediaTags.includes("HIRES_LOSSLESS"); + return album.mediaTags.includes("LOSSLESS") && !isHires; + } + return true; + }); + + const sortedResults = [...filteredResults].sort((a, b) => { + if (sortBy === "duration") { + return (b.duration || 0) - (a.duration || 0); + } + if (sortBy === "year") { + const dateA = new Date(a.releaseDate || 0).getFullYear(); + const dateB = new Date(b.releaseDate || 0).getFullYear(); + return dateB - dateA; // Newest first + } + return 0; + }); + + function formatDuration(seconds: number) { + const m = Math.floor(seconds / 60); + const s = seconds % 60; + return `${m}:${s.toString().padStart(2, "0")}`; + } + + const copyToClipboard = async (text: string, id: string) => { + try { + await navigator.clipboard.writeText(text); + + // Clear existing timeout to prevent premature hiding + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + + setCopiedId(id); + toast.success("Copied to clipboard!"); + + timeoutRef.current = setTimeout(() => { + setCopiedId(null); + timeoutRef.current = null; + }, 2000); + } catch (err) { + console.error("Failed to copy:", err); + toast.error("Failed to copy link"); + } + }; + + function getYear(dateString?: string) { + if (!dateString) return ""; + return new Date(dateString).getFullYear().toString(); + } + + return ( +
+
+
+ + setQuery(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && handleSearch()} + className="flex-1 border-none shadow-none bg-transparent focus-visible:ring-0 h-9 font-medium" + /> +
+ setCountryCode(e.target.value.toUpperCase().slice(0, 2))} + className="w-14 border-none shadow-none bg-transparent focus-visible:ring-0 h-9 text-center font-mono text-xs uppercase text-muted-foreground focus:text-foreground transition-colors" + maxLength={2} + title="Region (ISO 3166-1 alpha-2)" + /> + +
+ +
+ + + +
+
+ + + {sortedResults.length === 0 && !loading && ( +
+
+ +
+

{query ? "No results found" : "Start your search above"}

+
+ )} + +
+ {sortedResults.map((album) => { + const artworkUrl = album.imageCover && album.imageCover.length > 0 + ? album.imageCover.find(img => img.width === 640)?.url || album.imageCover[0].url + : null; + + return ( + copyToClipboard(album.url, album.id)} + > +
+ {artworkUrl ? ( + {album.title} + ) : ( +
+ +
+ )} + + {/* Overlay */} +
+
+ {copiedId === album.id ? ( +
+
+ +
+ COPIED +
+ ) : ( + <> + + + + + )} +
+
+ + {/* Quality Badges - Refined Layout */} + {album.mediaTags && ( +
+ {album.mediaTags.includes("HIRES_LOSSLESS") && ( + HI-RES + )} + {album.mediaTags.includes("MQA") && ( + MQA + )} + {!album.mediaTags.includes("HIRES_LOSSLESS") && !album.mediaTags.includes("MQA") && album.mediaTags.includes("LOSSLESS") && ( + LOSSLESS + )} + {album.mediaTags.includes("DOLBY_ATMOS") && ( + ATMOS + )} + {album.mediaTags.includes("SONY_360RA") && ( + 360RA + )} +
+ )} +
+ +
+

{album.title}

+
+ +
+ {album.artists && album.artists.length > 0 ? ( + album.artists.map((artist, index) => ( +
+ { + e.stopPropagation(); + navigator.clipboard.writeText(artist.name); + toast.success(`Copied "${artist.name}"`); + }} + > + {artist.name} + + {index < album.artists.length - 1 && ( + , + )} +
+ )) + ) : ( + Unknown Artist + )} +
+
+
+
+ {album.releaseDate && ( + {getYear(album.releaseDate)} + )} + {formatDuration(album.duration) && ( + <> + + {formatDuration(album.duration)} + + )} +
+
+
+ ); + })} +
+
+
+ ); +} + +function ScrollableContent({ children, className }: { children: React.ReactNode, className?: string }) { + const [isHovered, setIsHovered] = useState(false); + const containerRef = useRef(null); + const contentRef = useRef(null); + const [scrollDistance, setScrollDistance] = useState(0); + const [duration, setDuration] = useState(0); + + useEffect(() => { + if (containerRef.current && contentRef.current) { + const containerWidth = containerRef.current.offsetWidth; + const contentWidth = contentRef.current.offsetWidth; + + if (contentWidth > containerWidth) { + const distance = contentWidth - containerWidth; + setScrollDistance(distance); + setDuration(distance * 0.01); // Adjust speed + } else { + setScrollDistance(0); + } + } + }, [children]); + + return ( +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + 0 ? -scrollDistance : 0 }} + transition={{ + duration: duration, + ease: "linear", + repeat: isHovered ? Infinity : 0, + repeatType: "mirror", + repeatDelay: 1 + }} + > + {children} + +
+ ); +} diff --git a/components/tool-checker.tsx b/components/tool-checker.tsx new file mode 100644 index 0000000..02f315a --- /dev/null +++ b/components/tool-checker.tsx @@ -0,0 +1,169 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { ToolCheckResult } from '@/lib/tool-check'; +import { RefreshCw, AlertTriangle, CheckCircle } from 'lucide-react'; + +export function ToolChecker({ children }: { children: React.ReactNode }) { + const [result, setResult] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [skipped, setSkipped] = useState(false); + + const checkTools = async () => { + setLoading(true); + setError(null); + try { + const res = await fetch('/api/system/check-tools'); + if (!res.ok) { + throw new Error('Failed to check tools'); + } + const data: ToolCheckResult = await res.json(); + setResult(data); + } catch (err) { + setError('Failed to communicate with the server.'); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + checkTools(); + }, []); + + const handleSkip = () => { + if (confirm("WARNING: Skipping these checks may cause the application to fail or produce corrupt files. Are you sure you want to proceed without the required tools?")) { + setSkipped(true); + } + }; + + if (loading) { + return ( +
+
+ +

Checking system prerequisites...

+
+
+ ); + } + + if (error) { + return ( +
+
+
+ +
+

System Check Failed

+

{error}

+
+ + +
+
+
+ ); + } + + if (result && !result.allExists && !skipped) { + return ( +
+
+
+
+ +
+

System Check Failed

+

+ {result.mkbrrPresetExists === false + ? 'The required "red" preset for mkbrr is missing.' + : 'Some required CLI tools are missing from your system. Please install them to continue.'} +

+
+ +
+ {result.tools.map((tool) => ( +
+
+ {tool.name} +
+ {tool.exists ? ( +
+ + Installed +
+ ) : ( +
+ + Missing +
+ )} +
+ ))} + + {result.mkbrrPresetExists === false && ( +
+
+
+ mkbrr preset: red +
+ + Missing +
+
+

+ Please create the preset by following the documentation. +

+ + View Documentation + +
+
+ )} +
+ +
+ + +
+
+
+ ); + } + + return <>{children}; +} diff --git a/components/ui/alert.tsx b/components/ui/alert.tsx new file mode 100644 index 0000000..6ca2341 --- /dev/null +++ b/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-red-400 bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-red-400/90", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/components/ui/audio-wave.tsx b/components/ui/audio-wave.tsx new file mode 100644 index 0000000..c3020d8 --- /dev/null +++ b/components/ui/audio-wave.tsx @@ -0,0 +1,63 @@ +"use client"; + +import { motion } from "motion/react"; + +export function AudioWave() { + return ( + <> +
+ {[...Array(20)].map((_, i) => ( + ({ + height: ["20%", "70%"], + transition: { + duration: 3, + repeat: Infinity, + type: "spring", + repeatType: "reverse", + stiffness: Math.random() * 100 + 10, + damping: Math.random() * 5 + 10, + delay: i * 0.05, + }, + }), + }} + initial="initial" + animate="animate" + className="w-2 bg-primary/50 rounded-full" + /> + ))} +
+ +
+ {[...Array(20)].map((_, i) => ( + ({ + height: ["20%", "70%"], + transition: { + duration: 8, + repeat: Infinity, + type: "spring", + repeatType: "reverse", + stiffness: Math.random() * 100 + 10, + damping: Math.random() * 5 + 10, + delay: i * 0.05, + }, + }), + }} + initial="initial" + animate="animate" + className="w-2 bg-primary/10 rounded-full" + /> + ))} +
+ + ); +} \ No newline at end of file diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx new file mode 100644 index 0000000..3cbd373 --- /dev/null +++ b/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-red-400 text-white [a&]:hover:bg-red-400/90 focus-visible:ring-red-400/20 dark:focus-visible:ring-red-400/40 dark:bg-red-400/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span" + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..44f8ddb --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,60 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90 cursor-pointer", + destructive: + "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 cursor-pointer", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 cursor-pointer", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", + "icon-sm": "size-8", + "icon-lg": "size-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : "button" + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/components/ui/card.tsx b/components/ui/card.tsx new file mode 100644 index 0000000..681ad98 --- /dev/null +++ b/components/ui/card.tsx @@ -0,0 +1,92 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Card({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardAction, + CardDescription, + CardContent, +} diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx new file mode 100644 index 0000000..0edcceb --- /dev/null +++ b/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/components/ui/input.tsx b/components/ui/input.tsx new file mode 100644 index 0000000..8916905 --- /dev/null +++ b/components/ui/input.tsx @@ -0,0 +1,21 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +function Input({ className, type, ...props }: React.ComponentProps<"input">) { + return ( + + ) +} + +export { Input } diff --git a/components/ui/scroll-area.tsx b/components/ui/scroll-area.tsx new file mode 100644 index 0000000..8e4fa13 --- /dev/null +++ b/components/ui/scroll-area.tsx @@ -0,0 +1,58 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +function ScrollArea({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + + ) +} + +function ScrollBar({ + className, + orientation = "vertical", + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { ScrollArea, ScrollBar } diff --git a/components/ui/select.tsx b/components/ui/select.tsx new file mode 100644 index 0000000..25e5439 --- /dev/null +++ b/components/ui/select.tsx @@ -0,0 +1,187 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Select({ + ...props +}: React.ComponentProps) { + return +} + +function SelectGroup({ + ...props +}: React.ComponentProps) { + return +} + +function SelectValue({ + ...props +}: React.ComponentProps) { + return +} + +function SelectTrigger({ + className, + size = "default", + children, + ...props +}: React.ComponentProps & { + size?: "sm" | "default" +}) { + return ( + + {children} + + + + + ) +} + +function SelectContent({ + className, + children, + position = "popper", + align = "center", + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ) +} + +function SelectLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue, +} diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx new file mode 100644 index 0000000..275381c --- /dev/null +++ b/components/ui/separator.tsx @@ -0,0 +1,28 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +function Separator({ + className, + orientation = "horizontal", + decorative = true, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Separator } diff --git a/components/ui/skeleton.tsx b/components/ui/skeleton.tsx new file mode 100644 index 0000000..32ea0ef --- /dev/null +++ b/components/ui/skeleton.tsx @@ -0,0 +1,13 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Skeleton } diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..6c01864 --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client" + +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/example.json b/example.json new file mode 100644 index 0000000..ceeb0ab --- /dev/null +++ b/example.json @@ -0,0 +1,91 @@ +{ + "status": "success", + "response": { + "group": { + "wikiBody": "1. Não a Nós, Senhor
\r\n2. Jesus É Rei
\r\n3. Jesus É o Rei de Toda a Terra
\r\n4. Te Adoramos Rei dos Reis
\r\n5. Eu Te Amo
\r\n6. Salmo 103
\r\n7. As Misericórdias do Senhor
\r\n8. Os Teus Tabernáculos
\r\n9. Glória, Força, Honra e Poder
\r\n10. Digno És Tu Senhor
\r\n11. Te Adorar Meu Senhor
\r\n12. Sonda Me Senhor
\r\n13. Jesus É o Caminho
\r\n14. Recebe Senhor
\r\n15. Ser
\r\n16. Tu És Deus
\r\n17. Te Exaltarei
\r\n18. Reina em Mim
\r\n19. Buscarei
\r\n20. Poderoso", + "bbBody": "1. Não a Nós, Senhor\r\n2. Jesus É Rei\r\n3. Jesus É o Rei de Toda a Terra\r\n4. Te Adoramos Rei dos Reis\r\n5. Eu Te Amo\r\n6. Salmo 103\r\n7. As Misericórdias do Senhor\r\n8. Os Teus Tabernáculos\r\n9. Glória, Força, Honra e Poder\r\n10. Digno És Tu Senhor\r\n11. Te Adorar Meu Senhor\r\n12. Sonda Me Senhor\r\n13. Jesus É o Caminho\r\n14. Recebe Senhor\r\n15. Ser\r\n16. Tu És Deus\r\n17. Te Exaltarei\r\n18. Reina em Mim\r\n19. Buscarei\r\n20. Poderoso", + "wikiImage": "https:\/\/ptpimg.me\/b2f93a.jpg", + "id": 2658523, + "name": "Ca\u0302nticos de Intimidade", + "year": 2007, + "recordLabel": "", + "catalogueNumber": "", + "releaseType": 1, + "categoryId": 1, + "categoryName": "Music", + "time": "2025-11-30 23:22:30", + "collages": null, + "personalCollages": null, + "vanityHouse": false, + "isBookmarked": false, + "musicInfo": { + "composers": [], + "dj": [], + "artists": [ + { + "id": 1053992, + "name": "Daniel Souza" + } + ], + "with": [ + { + "id": 1053995, + "name": "Asaph Borba" + }, + { + "id": 1867489, + "name": "Luciene Silva" + } + ], + "conductor": [], + "remixedBy": [], + "producer": [] + }, + "tags": [ + "gospel", + "jazz", + "christian", + "worship", + "brazilian" + ] + }, + "torrent": { + "id": 5909266, + "infoHash": "3C2146F36B2F1E4DAE3EF38FFDE1ECA215AA64AD", + "media": "WEB", + "format": "FLAC", + "encoding": "Lossless", + "remastered": true, + "remasterYear": 2007, + "remasterTitle": "", + "remasterRecordLabel": "Daniel Souza", + "remasterCatalogueNumber": "7027306347229", + "scene": false, + "hasLog": false, + "hasCue": false, + "logScore": 0, + "ripLogIds": [], + "fileCount": 21, + "size": 502086702, + "canUseToken": true, + "seeders": 1, + "leechers": 0, + "snatched": 0, + "has_snatched": false, + "trumpable": false, + "trumpable_reasons": [], + "lossyWebApproved": false, + "lossyMasterApproved": false, + "freeTorrent": false, + "isNeutralleech": false, + "isFreeload": false, + "reported": false, + "time": "2025-11-30 23:22:30", + "description": "Sourced from TIDAL", + "fileList": "01 - Nao a Nos, Senhor.flac{{{29622105}}}|||02 - Jesus E Rei.flac{{{22892945}}}|||03 - Jesus E o Rei de Toda a Terra.flac{{{23442726}}}|||04 - Te Adoramos Rei dos Reis.flac{{{38852326}}}|||05 - Eu Te Amo.flac{{{19745511}}}|||06 - Salmo 103.flac{{{23952192}}}|||07 - As Misericordias do Senhor.flac{{{23323793}}}|||08 - Os Teus Tabernaculos.flac{{{18271370}}}|||09 - Gloria, Forca, Honra e Poder.flac{{{12328958}}}|||10 - Digno Es Tu Senhor.flac{{{25236570}}}|||11 - Te Adorar Meu Senhor.flac{{{37041630}}}|||12 - Sonda Me Senhor.flac{{{21337370}}}|||13 - Jesus E o Caminho.flac{{{21333085}}}|||14 - Recebe Senhor.flac{{{31844584}}}|||15 - Ser.flac{{{30673580}}}|||16 - Tu Es Deus.flac{{{18789112}}}|||17 - Te Exaltarei.flac{{{18988544}}}|||18 - Reina em Mim.flac{{{38962809}}}|||19 - Buscarei.flac{{{23038407}}}|||20 - Poderoso.flac{{{22170771}}}|||cover.jpg{{{238314}}}", + "filePath": "Daniel Souza - Canticos de Intimidade (2007) [FLAC]", + "userId": 67749, + "username": "anon28410" + } + } +} \ No newline at end of file diff --git a/lib/qbittorrent.ts b/lib/qbittorrent.ts new file mode 100644 index 0000000..7a14801 --- /dev/null +++ b/lib/qbittorrent.ts @@ -0,0 +1,98 @@ +import parseTorrent from 'parse-torrent'; + +const QBIT_URL = process.env.QUI_CLIENT_PROXY; + +if (!QBIT_URL) { + console.warn("QUI_CLIENT_PROXY is not set. qBittorrent integration will not work."); +} + +export async function addTorrent(fileBuffer: Buffer, filename: string, category: string = 'RED'): Promise { + if (!QBIT_URL) throw new Error("QUI_CLIENT_PROXY not configured"); + + // Parse torrent to get hash + const parsed = await parseTorrent(fileBuffer); + const hash = parsed.infoHash; + + if (!hash) throw new Error("Could not parse info hash from torrent file"); + + const formData = new FormData(); + const blob = new Blob([new Uint8Array(fileBuffer)], { type: 'application/x-bittorrent' }); + formData.append('torrents', blob, filename); + formData.append('stopped', 'true'); // Add in paused state + formData.append('tags', 'Crossfade'); + formData.append('category', category); // Add category + formData.append('skip_checking', 'true'); + // formData.append('autoTMM', 'false'); + // formData.append('savepath', '/downloads/'); // Optional: let qbit use default + + const res = await fetch(`${QBIT_URL}/api/v2/torrents/add`, { + method: 'POST', + body: formData, + }); + + if (!res.ok) { + throw new Error(`Failed to add torrent: ${res.statusText}`); + } + + return hash; +} + +export async function recheckTorrent(hash: string) { + if (!QBIT_URL) throw new Error("QUI_CLIENT_PROXY not configured"); + + const formData = new FormData(); + formData.append('hashes', hash); + + const res = await fetch(`${QBIT_URL}/api/v2/torrents/recheck`, { + method: 'POST', + body: formData, + }); + + if (!res.ok) { + throw new Error(`Failed to trigger recheck: ${res.statusText}`); + } +} + +export async function resumeTorrent(hash: string) { + if (!QBIT_URL) throw new Error("QUI_CLIENT_PROXY not configured"); + + const formData = new FormData(); + formData.append('hashes', hash); + + const res = await fetch(`${QBIT_URL}/api/v2/torrents/start`, { + method: 'POST', + body: formData, + }); + + if (!res.ok) { + throw new Error(`Failed to resume torrent: ${res.statusText}`); + } +} + +export interface TorrentInfo { + hash: string; + name: string; + state: string; + progress: number; + size: number; + added_on: number; + completion_on: number; +} + +export async function getTorrentInfo(hash: string): Promise { + if (!QBIT_URL) throw new Error("QUI_CLIENT_PROXY not configured"); + + const res = await fetch(`${QBIT_URL}/api/v2/torrents/info?hashes=${hash}`); + + if (!res.ok) { + throw new Error(`Failed to get torrent info: ${res.statusText}`); + } + + const data = await res.json(); + if (Array.isArray(data) && data.length > 0) { + //console.log(data); + return data[0] as TorrentInfo; + } + + return null; +} diff --git a/lib/tool-check.ts b/lib/tool-check.ts new file mode 100644 index 0000000..ffb9eea --- /dev/null +++ b/lib/tool-check.ts @@ -0,0 +1,96 @@ +import { exec } from 'child_process'; +import { promisify } from 'util'; +import * as fs from 'fs/promises'; +import * as path from 'path'; +import * as os from 'os'; + +const execAsync = promisify(exec); + +export type ToolStatus = { + name: string; + exists: boolean; + path?: string; +}; + +export type ToolCheckResult = { + allExists: boolean; + tools: ToolStatus[]; + mkbrrPresetExists?: boolean; +}; + +const REQUIRED_TOOLS = ['sox', 'mkbrr', 'salmon']; + +async function checkMkbrrPreset(): Promise { + const tempDir = os.tmpdir(); + const dummyFile = path.join(tempDir, `mkbrr_check_${Date.now()}`); + const outputFile = `${dummyFile}.torrent`; + const presetName = 'red'; + + try { + // Create a dummy file + await fs.writeFile(dummyFile, 'test'); + + // Try to create a torrent with the red preset + // We expect this to fail if the preset doesn't exist + // If it succeeds (or fails for other reasons but finds the preset), we're good + try { + // Explicitly set output file to ensure we know where it is for cleanup + await execAsync(`mkbrr create "${dummyFile}" -P ${presetName} -o "${outputFile}"`); + return true; + } catch (error: any) { + // Check for the specific error message indicating the preset is missing + // We use the presetName variable so this logic holds if we change the preset for testing + if (error.stderr && error.stderr.includes(`preset "${presetName}" not found`)) { + return false; + } + // If it failed for another reason (e.g. file issue), but didn't complain about the preset, + // we assume the preset exists. + return true; + } + } catch (error) { + console.error('Error checking mkbrr preset:', error); + return false; // Fail safe + } finally { + // Cleanup + try { + await fs.unlink(dummyFile); + await fs.unlink(outputFile).catch(() => { }); // Ignore if torrent wasn't created + } catch (e) { + // Ignore cleanup errors + } + } +} + +export async function checkTools(): Promise { + const results: ToolStatus[] = await Promise.all( + REQUIRED_TOOLS.map(async (tool) => { + try { + const { stdout } = await execAsync(`which ${tool}`); + return { + name: tool, + exists: true, + path: stdout.trim(), + }; + } catch (error) { + return { + name: tool, + exists: false, + }; + } + }) + ); + + const allExists = results.every((result) => result.exists); + + let mkbrrPresetExists = true; + const mkbrrStatus = results.find(r => r.name === 'mkbrr'); + if (mkbrrStatus && mkbrrStatus.exists) { + mkbrrPresetExists = await checkMkbrrPreset(); + } + + return { + allExists: allExists && mkbrrPresetExists, + tools: results, + mkbrrPresetExists, + }; +} diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/lib/utils/audio.ts b/lib/utils/audio.ts new file mode 100644 index 0000000..c26172f --- /dev/null +++ b/lib/utils/audio.ts @@ -0,0 +1,117 @@ +import { parseFile } from 'music-metadata'; + +export interface AudioMetadata { + format: { + sampleRate?: number; + bitsPerSample?: number; + duration?: number; + bitrate?: number; + }; + common: { + title?: string; + artist?: string; + album?: string; + track?: { no: number | null; of: number | null }; + disk?: { no: number | null; of: number | null }; + year?: number; + date?: string; + copyright?: string; + barcode?: string; // UPC + artists?: string[]; + albumartist?: string; + }; + native?: { + tidalUrl?: string; + }; +} + +export async function getFlacMetadata(filePath: string): Promise { + try { + const metadata = await parseFile(filePath); + + // Extract Tidal URL from native tags if available + let tidalUrl: string | undefined; + if (metadata.native && metadata.native.vorbis) { + const urlTag = metadata.native.vorbis.find(tag => tag.id === 'URL'); + if (urlTag) { + tidalUrl = String(urlTag.value); + } + //console.log(metadata.native.vorbis); + } + + return { + format: { + sampleRate: metadata.format.sampleRate, + bitsPerSample: metadata.format.bitsPerSample, + duration: metadata.format.duration, + bitrate: metadata.format.bitrate, + }, + common: { + title: metadata.common.title, + artist: metadata.common.artist, + album: metadata.common.album, + track: metadata.common.track, + disk: metadata.common.disk, + year: metadata.common.year, + date: metadata.common.date, + copyright: metadata.common.copyright, + barcode: (metadata.native?.vorbis?.find(tag => tag.id === 'UPC')?.value as string) || metadata.common.barcode, + artists: metadata.common.artists, + albumartist: metadata.common.albumartist, + }, + native: { + tidalUrl + } + }; + } catch (error) { + console.error(`Error parsing metadata for ${filePath}:`, error); + throw error; + } +} + +export function parseLabel(rawLabel: string): string { + let label = rawLabel; + + const labelCleaners = [ + // Remove year and copyright/phonorecord symbols (strict 1900-2099 range) + (l: string) => l.replace(/(\(c\)|\(p\)|\u00A9|\u2117)?\s*\b(19|20)\d{2}\b\s*/gi, '').trim(), + // Remove leading/trailing copyright and phonorecord symbols + (l: string) => l.replace(/^(\(c\)|\(p\)|\u00A9|\u2117|\s)+/gi, '').replace(/(\(c\)|\(p\)|\u00A9|\u2117|\s)+$/gi, '').trim(), + // Handle "under exclusive license to" + (l: string) => { + const match = l.match(/under exclusive license to\s+(.*)/i); + return match ? match[1].trim() : l; + }, + // Handle "exclusively distributed by" + (l: string) => { + const match = l.match(/exclusively distributed by\s+(.*)/i); + return match ? match[1].trim() : l; + }, + // Handle "sob licença exclusiva de" (Portuguese) + (l: string) => { + const match = l.match(/sob licen[çc]a exclusiva de\s+(.*)/i); + return match ? match[1].trim() : l; + }, + // Handle "under license to" (non-exclusive) - keep text BEFORE this + (l: string) => { + const match = l.match(/(.*)\s+under license to/i); + return match ? match[1].trim().replace(/,$/, '').trim() : l; + }, + // Handle ", a division of" + (l: string) => { + const match = l.match(/(.*), a division of/i); + return match ? match[1].trim() : l; + } + ]; + + for (const cleaner of labelCleaners) { + label = cleaner(label); + } + + // Blank out if it contains "Records DK" + if (label.includes("Records DK")) { + return ""; + } + + return label; +} diff --git a/lib/utils/file-ops.ts b/lib/utils/file-ops.ts new file mode 100644 index 0000000..2a601bc --- /dev/null +++ b/lib/utils/file-ops.ts @@ -0,0 +1,37 @@ + +import fs from 'fs-extra'; +import path from 'path'; + +/** + * Recursively copies a directory or file using streams to avoid 'copyfile' syscall issues (EINVAL) + * on some cross-volume operations. + */ +export async function copyDirRecursive(src: string, dest: string) { + const stats = await fs.stat(src); + + if (stats.isDirectory()) { + await fs.ensureDir(dest); + const files = await fs.readdir(src); + + await Promise.all(files.map(async (file) => { + const srcPath = path.join(src, file); + const destPath = path.join(dest, file); + await copyDirRecursive(srcPath, destPath); + })); + } else { + await copyFileStream(src, dest); + } +} + +async function copyFileStream(src: string, dest: string) { + return new Promise((resolve, reject) => { + const readStream = fs.createReadStream(src); + const writeStream = fs.createWriteStream(dest); + + readStream.on('error', reject); + writeStream.on('error', reject); + writeStream.on('finish', resolve); + + readStream.pipe(writeStream); + }); +} diff --git a/lib/utils/paths.ts b/lib/utils/paths.ts new file mode 100644 index 0000000..6dcd5c2 --- /dev/null +++ b/lib/utils/paths.ts @@ -0,0 +1,55 @@ +import path from 'path'; +import fs from 'fs-extra'; + +// The watch folder is in the project root, which is the parent of the 'src' directory. +// process.cwd() in Next.js usually points to the project root (where package.json is). +// If package.json is in 'src', then process.cwd() is 'src'. +// Let's assume the structure: +// /Project +// /src (Next.js app) +// /watch + +export const WATCH_DIR_NAME = 'watch'; +export const SPECTROGRAMS_DIR_NAME = 'spectrograms'; + +export function getWatchPath(): string { + if (process.env.WATCH_DIR) { + return process.env.WATCH_DIR; + } + + // We assume the app is running from 'src' or the root containing 'src'. + // If process.cwd() is .../Crossfade/src, then watch is ../watch + // If process.cwd() is .../Crossfade, then watch is ./watch + + const cwd = process.cwd(); + if (cwd.endsWith('src')) { + return path.join(cwd, '..', WATCH_DIR_NAME); + } + return path.join(cwd, WATCH_DIR_NAME); +} + +export function getSpectrogramsPath(): string { + const cwd = process.cwd(); + if (cwd.endsWith('src')) { + return path.join(cwd, '..', SPECTROGRAMS_DIR_NAME); + } + return path.join(cwd, SPECTROGRAMS_DIR_NAME); +} + +export async function ensureWatchDir() { + const watchPath = getWatchPath(); + await fs.ensureDir(watchPath); + return watchPath; +} + +export async function ensureSpectrogramsDir() { + const specPath = getSpectrogramsPath(); + await fs.ensureDir(specPath); + return specPath; +} + +export function getOutputDir(): string | null { + const outputDir = process.env.OUTPUT_DIR; + if (!outputDir) return null; + return outputDir; +} diff --git a/lib/utils/sanitize.ts b/lib/utils/sanitize.ts new file mode 100644 index 0000000..2b72c64 --- /dev/null +++ b/lib/utils/sanitize.ts @@ -0,0 +1,29 @@ +import sanitize from 'sanitize-filename'; + +export function sanitizeName(name: string): string { + // Use the same logic as album name to keep consistency and allow brackets + return sanitizeAlbumName(name); +} + +export function sanitizeAlbumName(name: string): string { + // 1. Replace " / " or "/" with ", " + let clean = name.replace(/\s*\/\s*/g, ', '); + + // 1.5 Replace "&" with "and" + clean = clean.replace(/&/g, 'and'); + + // 2. Remove accents/diacritics (e.g. "Espírito" -> "Espirito") + // Note: Re-normalizing to NFC to correctly recompose Korean Hangul characters + clean = clean.normalize("NFD").replace(/[\u0300-\u036f]/g, "").normalize("NFC"); + + // 3. Remove non-ascii characters but keep [], (), spaces, hyphens and plus signs. + // Also allow Asian characters (Chinese, Japanese, Korean) along with CJK punctuation. + const allowed = /[^a-zA-Z0-9 \-_.\[\](),+\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\u3000-\u303F\uFF00-\uFFEF]/gu; + + clean = clean.replace(allowed, ''); + + // 4. Remove double spaces + clean = clean.replace(/\s+/g, ' '); + + return clean.trim(); +} diff --git a/lib/utils/verify-red-fixes.ts b/lib/utils/verify-red-fixes.ts new file mode 100644 index 0000000..59a379c --- /dev/null +++ b/lib/utils/verify-red-fixes.ts @@ -0,0 +1,59 @@ + +function verifyRedFixes() { + console.log("--- Verifying RED Template Helper Functions ---"); + + // Test Split Logic which was duplicated + const splitArtists = (artistString: string) => { + return artistString.split(/,\s+|&|\s+\/\s+/).map((a: string) => a.trim()).filter((a: string) => a.length > 0); + }; + + console.log("--- Artist Split Check ---"); + const testStr = "Artist A, Artist B & Artist C"; + const res = splitArtists(testStr); + console.log(`Input: "${testStr}"`); + console.log(`Output: ${JSON.stringify(res)}`); + if (res.length === 3 && res[1] === "Artist B") { + console.log("PASS: Artist split logic works."); + } else { + console.log("FAIL: Artist split logic failed."); + } + + console.log("\n--- RED Artist Logic Check ---"); + // Simulate the logic in route.ts + const mainArtistName = "Artist A, Artist B"; + const allUniqueArtists = new Set(["Artist A", "Artist B", "Artist C"]); + + const mainArtistComponents = splitArtists(mainArtistName); + const mainArtists = mainArtistComponents.map(name => ({ name })); + const withArtists: { name: string }[] = []; + + allUniqueArtists.forEach(a => { + if (!mainArtistComponents.includes(a) && a !== 'Various Artists') { + withArtists.push({ name: a }); + } + }); + + console.log(`Main Artist Input: "${mainArtistName}"`); + console.log(`Main Artists Output: ${JSON.stringify(mainArtists)}`); + console.log(`With Artists Output: ${JSON.stringify(withArtists)}`); + + if (mainArtists.length === 2 && withArtists.length === 1 && withArtists[0].name === "Artist C") { + console.log("PASS: RED Template artist logic correct."); + } else { + console.log("FAIL: RED Template artist logic incorrect."); + } + + console.log("\n--- RED Label Logic Check ---"); + let label = "4059882 Records DK"; + label = label.replace(/(\(c\)|\u00A9|\u2117)?\s*\b(19|20)\d{2}\b\s*/gi, '').trim(); + console.log(`Label Input: "4059882 Records DK"`); + console.log(`Label Output: "${label}"`); + + if (label === "4059882 Records DK") { + console.log("PASS: Label preserved."); + } else { + console.log("FAIL: Label corrupted."); + } +} + +verifyRedFixes(); diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..66e1566 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,8 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ + reactCompiler: true, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..91499d1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8345 @@ +{ + "name": "app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "app", + "version": "0.1.0", + "dependencies": { + "@ctrl/qbittorrent": "^9.11.0", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "@types/fs-extra": "^11.0.4", + "@types/mime": "^3.0.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "fs-extra": "^11.3.2", + "lucide-react": "^0.555.0", + "mime": "^4.1.0", + "motion": "^12.23.25", + "music-metadata": "^11.10.3", + "next": "^16.0.7", + "parse-torrent": "^11.0.19", + "react": "19.2.0", + "react-dom": "19.2.0", + "sanitize-filename": "^1.6.3", + "sonner": "^2.0.7", + "tailwind-merge": "^3.4.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.17", + "@types/node": "^20.19.25", + "@types/parse-torrent": "^5.8.8", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "babel-plugin-react-compiler": "1.0.0", + "baseline-browser-mapping": "^2.10.18", + "eslint": "^9.39.1", + "eslint-config-next": "16.0.6", + "tailwindcss": "^4", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "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/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.0.tgz", + "integrity": "sha512-X999CKBxGwX8wW+4gFibsbiNdwqmdQEXmUejIWaIqdrHBgS5ARIOOeyiQbHjP9G58xVEPcuvP6VwwH3A0OFTOA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@ctrl/magnet-link": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/magnet-link/-/magnet-link-4.2.0.tgz", + "integrity": "sha512-4pa9hnMWmgoGl+5HJ/B9d5ugIr105AGD3rsTSlE8pTR7d2+xrEhLPCKRp/Y6k/k9Fo6DaJ1FRgwRxdi60vmxtg==", + "license": "MIT", + "workspaces": [ + "demo" + ], + "dependencies": { + "rfc4648": "^1.5.4", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ctrl/qbittorrent": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/@ctrl/qbittorrent/-/qbittorrent-9.11.0.tgz", + "integrity": "sha512-mltiPLncdpAHrRbd2H8uy9nTgFhk0urcmkHxCDHcJehRvgd6ta2qnhQ2aO0KI8lgNDvHfmiNh4FAx0yoPBz8Xg==", + "license": "MIT", + "dependencies": { + "@ctrl/magnet-link": "^4.2.0", + "@ctrl/shared-torrent": "^6.5.0", + "@ctrl/torrent-file": "^4.4.0", + "cookie": "^1.0.2", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "type-fest": "^5.2.0", + "ufo": "^1.6.1", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ctrl/shared-torrent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@ctrl/shared-torrent/-/shared-torrent-6.5.0.tgz", + "integrity": "sha512-Wu5XEPLomfmLWUW+UY63yB7g3orZDMgAZVEOYonVJOwajVlMcfT0AkEVtqeOjAhkCC9Q/VKXlHEP9G/xdyW4qA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ofetch": "^1.4.1" + } + }, + "node_modules/@ctrl/torrent-file": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@ctrl/torrent-file/-/torrent-file-4.4.0.tgz", + "integrity": "sha512-e/AuvVqH6xJxeowZeGD83YtViDDDEtK6LcIrtU7PsxJlDNMvyqPN2wpZsIXYRxPY+NqkiWcpkrpAnHLTPD6dpw==", + "license": "MIT", + "dependencies": { + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "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" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "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" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "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" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.7.tgz", + "integrity": "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.6.tgz", + "integrity": "sha512-9INsBF3/4XL0/tON8AGsh0svnTtDMLwv3iREGWnWkewGdOnd790tguzq9rX8xwrVthPyvaBHhw1ww0GZz0jO5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.7.tgz", + "integrity": "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz", + "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz", + "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz", + "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz", + "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz", + "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz", + "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz", + "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "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.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "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/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "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-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "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-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "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-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "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-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "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.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "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-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "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-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "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.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "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/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "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-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "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.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "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/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "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-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "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/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "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.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "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-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "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.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "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-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "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.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-x64": "4.1.17", + "@tailwindcss/oxide-freebsd-x64": "4.1.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.6.0", + "@emnapi/runtime": "^1.6.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", + "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.17", + "@tailwindcss/oxide": "4.1.17", + "postcss": "^8.4.41", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@thaunknown/thirty-two": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@thaunknown/thirty-two/-/thirty-two-1.0.5.tgz", + "integrity": "sha512-Q53KyCXweV1CS62EfqtPDqfpksn5keQ59PGqzzkK+g8Vif1jB4inoBCcs/BUSdsqddhE3G+2Fn+4RX3S6RqT0A==", + "license": "MIT", + "dependencies": { + "uint8-util": "^2.2.5" + }, + "engines": { + "node": ">=0.2.6" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/magnet-uri": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/magnet-uri/-/magnet-uri-5.1.5.tgz", + "integrity": "sha512-SbBjlb1KGe38VfjRR+mwqztJd/4skhdKkRbIzPDhTy7IAeEAPZWIVSEkZw00Qr4ZZOGR3/ATJ20WWPBfrKHGdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.4.tgz", + "integrity": "sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/parse-torrent": { + "version": "5.8.8", + "resolved": "https://registry.npmjs.org/@types/parse-torrent/-/parse-torrent-5.8.8.tgz", + "integrity": "sha512-CInK3z3BxMXUeO/UiUeSfpQ0CkjOAWZUCUigVn3ZkppeLZTm32/TepolcxzgYuk6q3z91gdWsmOW2S6fYx326w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/magnet-uri": "*", + "@types/node": "*", + "@types/parse-torrent-file": "*" + } + }, + "node_modules/@types/parse-torrent-file": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/parse-torrent-file/-/parse-torrent-file-4.0.6.tgz", + "integrity": "sha512-SxqVth0Iv0WuEkqWS5MaY4S4Tlyi+QHkElQREvsUPw2xHcPgKyQ2dkJRRv5vAxmLzH+tnMdOj1Nws/wsenbzUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", + "integrity": "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/type-utils": "8.48.1", + "@typescript-eslint/utils": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.48.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.1.tgz", + "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.1.tgz", + "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.48.1", + "@typescript-eslint/types": "^8.48.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz", + "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz", + "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz", + "integrity": "sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/utils": "8.48.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.1.tgz", + "integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz", + "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.48.1", + "@typescript-eslint/tsconfig-utils": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/visitor-keys": "8.48.1", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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, + "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/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.1.tgz", + "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.48.1", + "@typescript-eslint/types": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz", + "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.48.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "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, + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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/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, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "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, + "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" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "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.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.18.tgz", + "integrity": "sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bencode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", + "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", + "license": "MIT", + "dependencies": { + "uint8-util": "^2.2.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bep53-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bep53-range/-/bep53-range-2.0.0.tgz", + "integrity": "sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "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", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "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==", + "license": "MIT" + }, + "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-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, + "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==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-fetch-ponyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cross-fetch-ponyfill/-/cross-fetch-ponyfill-1.0.3.tgz", + "integrity": "sha512-uOBkDhUAGAbx/FEzNKkOfx3w57H8xReBBXoZvUnOKTI0FW0Xvrj3GrYv2iZXUqlffC1LMGfQzhmBM/ke+6eTDA==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "node-fetch": "^3.3.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "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, + "license": "BSD-2-Clause" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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, + "license": "MIT" + }, + "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==", + "dev": true, + "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" + } + }, + "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, + "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" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", + "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.6.tgz", + "integrity": "sha512-nx0Z2S50TlcSQ2RtyULCff5tlKTwqF/ICh3U9s8C/e2aRXAm1Ootdb7BEHGZmejtJSgsFq8PVFdlWy8BHiz2pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.0.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "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.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "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.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "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": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.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, + "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/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.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, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.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, + "license": "BSD-2-Clause", + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-type": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.1.1.tgz", + "integrity": "sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/framer-motion": { + "version": "12.23.25", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", + "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.23.23", + "motion-utils": "^12.23.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "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, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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, + "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" + } + }, + "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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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, + "license": "CC0-1.0" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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, + "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", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.555.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.555.0.tgz", + "integrity": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magnet-uri": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-7.0.7.tgz", + "integrity": "sha512-z/+dB2NQsXaDuxVBjoPLpZT8ePaacUmoontoFheRBl++nALHYs4qV9MmhTur9e4SaMbkCR/uPX43UMzEOoeyaw==", + "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": { + "@thaunknown/thirty-two": "^1.0.5", + "bep53-range": "^2.0.0", + "uint8-util": "^2.2.5" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "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, + "license": "ISC", + "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, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/motion": { + "version": "12.23.25", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.25.tgz", + "integrity": "sha512-Fk5Y1kcgxYiTYOUjmwfXQAP7tP+iGqw/on1UID9WEL/6KpzxPr9jY2169OsjgZvXJdpraKXy0orkjaCVIl5fgQ==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.23.25", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.23.23", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", + "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/music-metadata": { + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-11.10.3.tgz", + "integrity": "sha512-j0g/x4cNNZW6I5gdcPAY+GFkJY9WHTpkFDMBJKQLxJQyvSfQbXm57fTE3haGFFuOzCgtsTd4Plwc49Sn9RacDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.0", + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "file-type": "^21.1.1", + "media-typer": "^1.1.0", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.7.tgz", + "integrity": "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==", + "license": "MIT", + "dependencies": { + "@next/env": "16.0.7", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.0.7", + "@next/swc-darwin-x64": "16.0.7", + "@next/swc-linux-arm64-gnu": "16.0.7", + "@next/swc-linux-arm64-musl": "16.0.7", + "@next/swc-linux-x64-gnu": "16.0.7", + "@next/swc-linux-x64-musl": "16.0.7", + "@next/swc-win32-arm64-msvc": "16.0.7", + "@next/swc-win32-x64-msvc": "16.0.7", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "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, + "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" + } + }, + "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, + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "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/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "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", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-torrent": { + "version": "11.0.19", + "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-11.0.19.tgz", + "integrity": "sha512-T0lEkDdFVQsy0YxHIKjzDHSgt/yl57f3INs5jl7OZqAm77XDF0FgRgrv3LCKgSqsTOrMwYaF0t2761WKdvhgig==", + "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": { + "bencode": "^4.0.0", + "cross-fetch-ponyfill": "^1.0.3", + "get-stdin": "^9.0.0", + "magnet-uri": "^7.0.7", + "queue-microtask": "^1.2.3", + "uint8-util": "^2.2.5" + }, + "bin": { + "parse-torrent": "bin/cmd.js" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfc4648": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz", + "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==", + "license": "MIT" + }, + "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==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "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" + } + }, + "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, + "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" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "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, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "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" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "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 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-types": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", + "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.1.0", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/token-types/node_modules/@borewit/text-codec": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", + "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.48.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.48.1.tgz", + "integrity": "sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.48.1", + "@typescript-eslint/parser": "8.48.1", + "@typescript-eslint/typescript-estree": "8.48.1", + "@typescript-eslint/utils": "8.48.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, + "node_modules/uint8-util": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.5.tgz", + "integrity": "sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "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.2.0", + "picocolors": "^1.1.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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "license": "(WTFPL OR MIT)" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "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, + "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" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..731bca2 --- /dev/null +++ b/package.json @@ -0,0 +1,51 @@ +{ + "name": "app", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "@ctrl/qbittorrent": "^9.11.0", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "@types/fs-extra": "^11.0.4", + "@types/mime": "^3.0.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "fs-extra": "^11.3.2", + "lucide-react": "^0.555.0", + "mime": "^4.1.0", + "motion": "^12.23.25", + "music-metadata": "^11.10.3", + "next": "^16.0.7", + "parse-torrent": "^11.0.19", + "react": "19.2.0", + "react-dom": "19.2.0", + "sanitize-filename": "^1.6.3", + "sonner": "^2.0.7", + "tailwind-merge": "^3.4.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.17", + "@types/node": "^20.19.25", + "@types/parse-torrent": "^5.8.8", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "babel-plugin-react-compiler": "1.0.0", + "baseline-browser-mapping": "^2.10.18", + "eslint": "^9.39.1", + "eslint-config-next": "16.0.6", + "tailwindcss": "^4", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/sfx/error.mp3 b/public/sfx/error.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9f7d20eadfde52fc0987d1a87d28c206f000fd3c GIT binary patch literal 129024 zcmW)nWk8c%8^`aBF$RpT4FPFswh>aw=o&auO58?=bc?dlF{ELDK}$CZ7K70x4Js-n zqGDqUygu*wczrtOI=}mWUv-ZEEExj;O%vs~8fR3l_MHU)W`$vjs75*|EZ+R>MOp?4 z42YSQr1UT~_lfgwG;@F1ZSDqlI@kE#1c$-#TBon48z%V$e7k%da)!%yote}*B#cPI z1f2LD`$^#Kk3ThIMN?z>8Wk^NuO1!q*SCFXjZWYpqDpf`3jVS3`7Ia`T$vf%y@3&_=3f>oS$V~9TJ z#MYW26gF%Brg~f?tmsscIUJ0Y%~}erTun{Uond|I6S#37PrE{5%;NM(Hx3gQMmV;k zFW!0XCids?f$4O;Vq$T-T1K#&-T8Cyi=%aM&zI}|Cc6AxcUq3?&+dBqGWTQA^Qr4E zUzO}QdUndIr(GRYfBHCnO7Z9M*H5ca>-Rrfc%MBPTu^rBq_6;W)%IMA#smO1(G z!oxuQl?zA5bB`C-JJbHGtJuFzbBQ^5n0TCcd|aYdly#<${v_@G&lrJ!_Ypf->@cF| zw=D#W896U>@z2rwGViFXSE8n;QO1tKtkYaPI4~R41b{=}RG82-7Z}dY0=K2cWTkRP zqX>}WfBZ{a8)4`@J{cnpv_M(Ee%JtDrs?U5-FJeF$wAR{1o5oC}I7=?)g zu^?5lEd2?nUd{*sY7zc}VdHSNuUp4|yAReddwce_3i~0C!|b#+=cAsG?)AT;FRZNC zj?L>n*5q8jsrM1vlYfGHzu@X!f8U^|-A-!vTmu3xx+x8~jU~JR@`EL9V1;G~*u8W5>aO;h_XM z>PdqzS2+J5oo;>tTd5GqenPuGaH7JGlT$$269KwK1AC^J7EpOaVQyX@EKY?5Qj&V2 z;nnmxPTLswQ<=X#ReIE9{X2$*pI?7{IcVpeiq!cMwKB=?#i7nAU-nLTzvJ`3&edAV zn?J#fUmN;zv_Ek|OHe1@mQ^l0y6|3~>zDyjp(EpWH&LUcsLOKEMTvi?DV*wJDzo-6 zh9C#9-Ax9*UctC?+Mj-f$1wSLDsKKj|KZx^u3SNZ0V&qJrzjDgLMW;d#m3dmlBa~S zgCsMfgmj8=Q=zuW;I;7#mCgbvSeBSpY+lYJ2`1W+30Qo_&V3=iAjTRM(TZAP=aQtJ zQ4=EBnlW#X9`oIyXD>~8IF;W(Tk6T&xiOFJ!v~S2tM!>(jVcu-iwubND=q^4njxhk z@l!Qf{4LqATBDPQbpZ)iJEgzZWqVD#ELW*I{RIg%frd23`*)-n$bo-of%*R9AHn&mOmE`Ev-t3K zKMTy|Aoo?T*SxA$O3l-{grF8ns%EG_&-qhUGp!fKpUu8YZn3G9Wd_wx@@+>;a#ezL8p!cdaz(t`H zhL&52y=koZfdG2NedWr&r8MS=n;_&^#Sw&Q9wT5R#TG7<0vx&Fp3=c~5Hfn68&#HZ zt&Ep7jXSRb4ymmcM#RyjwNgZ2Y=T^>>`;5htQn!jt?M?~SC6WC*!}37x0x8@ds^fw z2-=jiF+QB7^Txsb^H-w-t?lpb&oxIJ6Czzd zCDFcM;v0#Q)?F2v>>I|Q4?P08+u>c?PhlUb{K_&gecc=*A3G#f#d^nyKwqQFyTcp= zS!2jtSZ<&Eys=a8Vg4btDuEfZDto7*lB_ZgH}49r-ZlR-G&ND@=+N0kC!cU(;@rV| zCAVu+-&AhZ=RDozt#J6>v}pP6!dP5P|Eq67??k-=PadtT21YA$a7k$zZ4*@8HE|(>a1OU{3fOU8<=p z{FDF=B{`guPuAMKuW1Xir?N9CS{ty9!>j~s5oiPKhAkGKjLk6UtYj$YjSKe?9scZG zu)Zn1Oq>_eLa79h9u>M&VCtVNSEP)%M7*{$UA=*v(y2+SJ8;14LFIkoHB@%SqMWh@ z)<0_eVSMOlv_)m$6-=BWB~ZkZMwrK9d+K~FRcac{Uog#NISiCufUzR)qkRD$^=~FR zZF~8QdC691j_?drQ8;^?s~0O`myf z1vNpW#&B|HPmi>q7PEP&ZGVceqbBF4D&E$Ji)NE{Pd1$Wm+*ZB-@}Q#LMwVR)jX%O zm`h$M7M_V}_4RmlR`Z=%h|A=2^`(Ng4dj!oRZuEgM;bB^+*TOiA6Y@Hx{e|#ug5Du_m*|NneBZq9d@XXY92`+zeE1f7Yen{;oiJvKN zR-%cI)>kSJrXzND(lFjbO6Jqqb5W8@xzfQg&6Y_jr`x1* zJxXyOsu4>{mY>Nun*4ugcZ5e+7tN%F{E83zUfdxuSSnVF1W zmd1A!*n~%{Ha?d0Dn3~pQ@wHnw!}TVnu4iUDJWwEFY`_Ao?b|gMh9mxrp^S+hOc)n zy$@-={v*&nq)6+>y;e8=)E55GqB!yGf#Zw6mjNK-0log5*9fcT+=9C-bwpi&I;Oxw zXOx{#A6DVR4HiJn=~8T=^fs0Uo5mdQ2dV@DpKP>GkN~v)Dk)g5sCL?5#(*?xgVzte~N4j9tRP~eV;N?87Q)2@I`}t%iBP8 zzY3dV-z9QwaGw~{Qig=_PD(NLl!0ZFuOYuzf6>F-krLwtP|%mqgqB-4HH|w43)5}+ zmwq*e8=)ocG`_cZv3lagrEj;sW_dhKlM+3yE?c_Vd=&}+^d7pYs}jQ+_m^=&wrJ7P z8$OmIMjqZ`Tl(n&8UMb&Ac>l0|GVuaGDj;KtLYeH0;X+StmX4dycj%g=y9xtp$U?b zmHG}6w#-DX~^fmQ2(^tUAxtH2`k6H9vyX!jwUSQ zTSYbBY`gs&51C8UfzagbAZ06l9wMcz3ADO&c$qrH6k+D$OFN%pPSdE8LN2c$<1?;@ zXCuUTk#-~`nFS$swalg&u`Ys8a6l9p)1VLmCO-bmyoL-gXTG~6lT)GcPF7UXOcvy! z)ftGYqrCvLhMBD?dC*u=NZGU7Od?V4t>M|)LAvt9&ea0%_!5Um<{J^vT-%p;>EkDoW@HeTz!5ts}j^XjrLK;Req_N-+Wd#86(A5Q-?;m4il zIS)?&iA`hkI&h~$V{zs;y~A^ zRz&*_AWX47*Z=TeNT?7Hb6Ok#SP@JF5CVq9ARv`ICrX76MNW&=-b9gapqs(597qSN z-|27qWXiP_maj1mZd*9#TE8-UT2+fVXmvWto9L9KW#207Cm;LN8~u7g`N~-Ig+Jdb zvR}q%9hxuudmtwLe7*ayA+Hi7eRmq2bkkGM0>TqT^BO;suV)CgO6Xo6l8_VRcmRpYYUvU za2n1oKmNB|bF8Dy`8dH8!87mr7JNNL2L7{dJ9%iH5-RBXzLl>l7?-XR7#s1Q`S|#2 zXU{dtF7||X7l73g;e>!G^bG!7AaQC2gv*h=&@Bdye@i*?e%uRdUl| zSUP2BVT3ydz-9I+H{_0M=SiX`g(Z5kX(;}NE!GV2QwHBrTtcwqQf_3pv%UdA8CrWD zxoM9)uovA;{nC$+HweqeZ1VAEO!JP+e>sQo|D|~a6Vz7jy`XR*(&o&awe@+Q_twl0 z6>QoMS*tk=IF@>4-XDK8iif@_PT}P zj331(NsBNDwUhf#|M{-H>M@(Y6#{^J<(~3=AOM0cikiW%lqVll?ar*re3r{2RT*HD zrA?ADE@_{dyd%cTA+9A?%zV**@*eT017{aP`I)kc-B+#o82R^Is|_!Gq;KK+J(Uzi ziXQZ!PrY?`rPEYgcMeDuSv_2Ncy|52)?VbKSCVIsq5p(=fUnJ~rSN+tlm&bp*#%`53s| zy7xuqCB|0g1@WzNQ^Upc#<-w4~BVvNL1Bc(5R2jOZ1K;Q?3L?hT@p*+85^cpWgT$|BZ)!m~4no)q-gcB=|@ zky=_JP4)F#mEme|P6`9=Ym9Fyp|l=LWn|3B=HPB<*iHXPUx(~u=@lkO{u$Xj?0t?T z8RZmwh^E5iE47)jqC%^wOVM`zI_G6Xox2tm5LLc1Z<@xt__@_HI;&hT{4p`&PXXW~ zeb70IgZw0A$$Wd-k|S~!RW_|QY&`1hPrbyz56#(7MX|$!biQdxBh=tH{}`oj@IU^A zuZ_$ZPn}q^+UVbN@w{viED-xzEW|%&a`k#m&WF7!0_TX~gFzS+$AsN~$868O(U7cr zZ3X5OT4bA0xoe!CWe8F->>Dist^;|T2!fH|L)HfViFwv@cLZ<5T`!Gl z>7sd`8-2YK_G9ciu#ROHakV5kV(uDcyOCZUF#;rlH7 zg$zl-Y5*pq|0<}oD#cH*Gx&~r;qnHZ%y%5j9Wn|R=Y|(5baBwD!l^d;69+RzPujXh z3+{SYE|fKWT(Dme)7H$sDzkd%-r#Un4ceLQIC^)brKUJH`rhit_f;{X&6wcW!YqzI za{w~}DoCYY36by>SOte^OpKC0i1^==do6hb8tY`5F=(36yb;Ph_6N=|M2y-!7#1JT zXGP;RQP;sJ^_g%c*#i-GAP5_Y6`AW&L6%@d05*u91zt-_VGpYqW#S2y;4bbTwSs|V zh_`fRzV1GD#yq+(ge`yjnb4|n*oiDQzNmfMwdGxnPxws0N@uSVIRAr-^)I5nwe`=Z zhmMUofiCOE{Zo#*CGR}X$LIu)tg>Bx`YK#X51LUuG>d@xCFS z`j~LYrOcrLp{<;M`EN2s?mCPqb}|8&@l#7#ZJ2{zxMyFSPY zCs~MQrxXlcuuK}y%8B=xGW$Gb*F)NT7oBvcNpSW2$;{EL62p*#NR zS3?ATFO1)1Q?WbTFFGqRo z)MHA2`QQUgeL2^5uX=yPp@b}``B^Oy z0*P!Z0Thf&K%p!p6H8dT#@hU-BI2B?_`jlE8()R zlHc8OFlkNFgLtwu$ZLe#i%`wd5cKqsH-$IoOBzv6GEjKfD|tLX3*klX@X~@3KjTP# zXNd$^7@1^~0Ru#l_Dr(yIP4IaK({5({SvyI5oEU5JA&s`M1jXQ`p~R!)&@rI*OGA$ zq|(FH4Be0J&(%fQbBA=1=|Qh3C~9HWZ$)nJ9FgS%*)6FYR5H8aI9EVT-qoD67L=>n<|s|MAlSf%oc zWF){)=V=FZE%QBC)_?qKa_+L}3^5%J8P23@i6_#Wg@DKKkUylMHzzikkM^pmz&S$& zf%DjKL2>cW+~&*NqD+9Nim+Tg$?a~e_fJRDv!7)n;UDR?WtsOE?s!@o=*xCn$ksRJ zlwamkkCM4_$@wu``TOR}kNX|Q&b~eR< z-9Qy1{F(;w=-|#s$l^rBjj8AIET~dM6g5mn{XA+Ypipl#M?HsqJF znLx}#0?&;nj1Rt?^W)%m>G~_iZ1YMe6j6vLynVVR#icCm;LP0F*j4YPB5A0%Sg731 zcICeD{HZq*jY0Q7v|F?F^-7yQKCS)b{oeLY{bw#JzMNgxWL6-UuL$&?{MP+@|7i(t zr4N@e!gTK0`CU-9TYbfNolpNc3m_~U&-zUWkS7~ z()7~_JCVbvzV%gf7M1O*Sh`ojhvLGg3JA8wgo!CrLLT)r7ItqoaD0Cq7aiY<0T*+wt+ce^sC!I?W??=A`4&G7D?$*kd8{ z$v6DiAqT#O!9pG-VWE7=D5n8M9Vok{U(sgpLAJu(ze^d3&+P6+5UZ+qx+MnjTZI4k zm%27mdzw-4CqA@NHn!$+uAac$HfPA^*GZe#34=%b;|+M}>!EVP09Jeys!&)%-ZAKa ziGzM-b|bbMG8<;UYZQy;vk4YfMllE>y0cv(TP%E^_4!S2xliCv%}uawrY$1>RDiFk z=CWBTsofUdzCc<0{@X+CXa1#!zHUdo>j9P^=JlD2MJtcD_kW24%F5Gqt&a-``=ZCnR+c3?^`M>s&uDuIyEJ z4TyU$$Al1pbf|tYu{`)}$k%KsXk-azo3f%yF$9;<6TP=WdRqYsPxsgfzRJx+-P?NGk{-73^~0& zYHkmlw@>I%r6l>anAjVPJeg_oe6S!HMsgh0BOSw?GV7xj!U->ML?M0-J_f>QbkGJ6 zV6MfXOi9L$w0K!M6xLLRZ^&CD=nSeC2yWBrln7}yC7axGCY#|GSl^J&DntpJblfcz zS4>Y!JxFLtcXfG9(zZxC$?+c3?{g`J4O~Xz9X2_k9Pmb$_h&01KJdf9_B;K@rUg>R zhOElezwsvz5c2%O!bySsWrg04DiCi=%f1ZHlrbl%kTWY$6#6qQM+hn&uN_vVe#c&; zT}riArL+7jrIm^*0(+52326UhRuNUQ+&DfTJy@ggmyVr=apQRm*qHaqm^=k}3TqXc z+#^Sge~2n?ht)oeXCHi5%;LIjWv`*>mii+~hSyuk$s{n%eKcTs@8X2<&bvhp`_<<7 zTwR_AfgyKZsekK#TGF-|^6l?f)Z60^D?SYGBD;_O3Cd9&1P&@;rFs`=&BS%?!ksaf zsIGW>suEDaS*o8OCe@Q_v8CtHi#~Uz#8WR{&(wz~K>w-p_{ELNrePL?wSdEBfY)<@~);fOT zjeV_jPFlNu9|zh#{_M$0e zu<-r+q~|Q%5z%hREBh-%-ZF=G+$p{Sqa}*qyYhl3T0I`@H23?aIqix!HacF9vr29L z@u;;j+FG*71XV^6UhN2VHJ#B`8I@?nv*!;5cIbwRIlEc4$|;hpbtx{_va8P@w(IJ_;UuN&k1ML8xJ4tc+B zVe&vNGjE8=U>*XU?I#>1Uf|WjF3QZ01A7K&8>ggyuF$oOI%Km+Pq>@+`ReoWb$yNo z;lJ_gvf&FS8(1@iX0WFuyJ#Npqteb3`7wcS?VKO--WbiYwJRxj&LV$%wJ zE#bGbCO>+y6!N2~`DC~bYv~L3`C>NQlgu`yi6lFo%yAc}dK4mI+W!iE{ne`&*9 zv_^%5CfAE}xU-*t2zk=U4G{+a@gJ0Xz)&^HKAfw)W%85wkN?F31{>E8>B*22RR%|T zeaX^(L)YAP7)S+9Ilf1ee1jETT|aK$^QlCG8ea0I2Xtt&cY+$8eM#NVZ)41=S6{jH zqHq5~BY*2Diu6*x?s5ZZo_*m>8Dv?i5 zFz6^Sl}KGX)0wFy_=}Q(%xqn@tq7bT%kOPC5I0ts(eU#yFGFKM3Jn=`z!z%S=YYC# z++Z?@igI*5{|)AyMVeinjCqJJ27=z-)6)nIqhd@4U7i*x>7Kd3BRdA~j@LrNr@laTYX3uO`O`F5B17A6u+BsBTELf=Nx~ca+ExV zM-8&z*3|A&W9Msd(ewP%Xl|9q_wHy6g-&qu@$}8Suu#L3=^JzA=CS2OtRDnb?0>*5 zE&;yXAZ<*k#^N`5J!){L`K6@y<)*^v-`R=`qUE6CJrZ86!>{EFEILH&Av>Ga&5v!J zgC!>xCJk6)2brUDBg@;Kn?E#Tdz8-ltnDRd%v?Lqw|WZG>Cvz60}?mvl9h@e@DqJJ z@OO+`IfTUuIOj$g=dCNV*+W|4D>ynlWn@!d-HW zlieKX=e6z7CPNiCta%4N8^5lK;NplBiNre2ZW$`eM&H1z%|5SfCc2abS?KbQpei1C zTd#o!r%IbUwtIgp?>2+=FG8`A-$~pVq@%XcSBrMSmdmZLr^CnkkGfy{`g3@E994=w z9vJ?(Lb%FZuW`XWwBT2LM+P-aPR_@HIXc{oQc)_~YD1%#1`^7$=td10*L4i>orVyY z!dJbdaVArsvUgAn6>6?B=I-DP%#&lca=XiR^mwC+QpfnMDBC zn-r9g|EtCmz~K0e^0dq$L4*nx1kuEdV&1B=Vk9^pG(@iDXsoAZ#3Jm)6qU?-VsknK zKD})cd{n3Md$zb%atI~#l>J8dTCZZpdbPY(=_Pr4HH-K>>fpi>!>cgwy{QCpDCsI! z<*b>}l%u!f%O@?E*@J+Qza(@uKIupO^nEu&-FpB)=@`6(o15*^qD@(gHjIE-GoC0h zCLeOv*J)G^TO!vQB(;doZW(~Ws->WL`I)>5k$v_2@v>Q|=PvtiRl>sAnDUKXloh%M z=lInhxW_!7a;2K~!^FGZ)$p*RBI9+0w}EKM1>FFXPfPdOY!OjAqb=Vt@O>g_ z+H~w`W$&{>muExsq1!p9@h?W~j|YAq=h>2DooQab^K+?EG@=S}5Uo%K=98xnL3?zO z4<7`2?`b)C^N%BKGO*Ga%!JFJ^2TzMP>1p77WqWO2Idl*2-(^eQP7D3p5}qa_nLZE zQ_Cnhk^-1gHJ(`hx-%>9mgth>j=WM0RmCD1)~1!OC-vov)$TI;#K8XJe-(c4P=!(P zcP_6i4S~H}ChPd%D=g%PCi-SjdRWWa>=XRZ%T*uD0nAY6+_*$U0y0$pt{^L)N zj|X0CPj?;${%E=S{!L8oQsB4T#59-~59BJ5*jwxAbmBJ&dBes>jBSgEfXpUlzYW3A zgDVKcI1dGOnsh;#3Ya-%0l<$eaA=dUWZ|lb7GLxUzFJT!kb1uS(`zhuw--bZoB@+G z2r-a_WKB5v5+4`LfI3P*hZmr za{@153d2eg#DMoBnaTz-%s}~@jHj(dk=Cc{iO=0ztiu(ww*Bf_o4>!)$z6XImDAs$ z_D3mN;*Pydc>w*He!kV|{ozK%*#SS{rrzUuil}2Gbhr3bX@oB_`)|4F7_2)_NId1GQpmN>U9rdK!Hwz zx0i@#dmfG0PPt0xNRlI7Wd1;?0gIDNQ-2a>$s2@VP$;2{3=n)kHiQgHD8Y){M<@m| zqE4BS8-l@xDLzjvLnU{!WJCOt=xKLR-lL;XL9a~NVMzxtCNx6UU1P4>Ox>VzZySS9 zmCwmThy!?I1`BSTJ_Er$kh$Yv$h+wBU;Oip%p9s?BzhSDZom5J*-ii?4B)?!hh(P1 z+FQx`9e^epkEQIWqIj#g<*7Lm{lLE@`Xr3PoW>Jb1V9AUVdOm9B#kCX;QSS$oy^un z&c(CdoZA*ZelzE2VS1N7J?J<3)z4G@H`Cl-(sA$OR9!*etftC{_Y`^Xh^zpfFiQalHo#2+7#Jt;lc@yve_mUr@Dnu2=8**Oc)g$|=b8>rgddM)H$)ea zH(1t$+%PC+L9C(MxR}zZp_PNFI4^{AWJd|e7z6{D>D81J!y#A_ZB&8VQ_@E^m}Z5B zfd@^x;mW~8EICwLt~{x-80Sc#JM)N_xOOym44F9aq|d4@SICD+1mn68G)tI?=`&~g zdzq(of%E1U+_$=m4)cDi z?wd%z z0zYYC63xF5*tV2^oHH3iI>?e({XR{aX-<^8wwk@*?RzYiczhi2b)YTr$YpKAs8N+7#f7wIiaK*GfuPOm1W2a!yuj=*-d4x$}Mnot9YC(J|A2+K@YiN>I} zgilF9gaooB0Rp%aT**rWZr}wWocx<0MaFmv`OGZ|NQ)6M2YgqMn%;~5@!w5`g_xg( zCK5o*a<4ZY?*pQL_m7?&0uVsz|NJ9mIKwg3_8QFUU3QhW>MqxEX+UKYG8-vvVIZHu zoh?N(he`K{r-X`U!bZSUoO_;jv%mfL&&s8*@Z;l8cX&eXzWM#ncmI{eKzaX$+{GtgVUe?Ugv~dm zVp>L$1tM2Qugi@)@>J4W!3Tq8kfmWZrWATA1Tut#B+xB^C3-suM^^$n)2)GZx*G78 z8_*_~gD9mbS4Yc)H;hb?T4&xQ^9B{BGP592)>K&7?&gchIz!1M2jR~t1}4`ha|R3T zL^4=21)*mNrj$%BE;vR{3&KCa!Nwy9k>&>LfRT`K`$Nag&}BosQrwnGKwuA1+^Qvy z{aUNtcaQyhJUa0(j1<>{4rS+M%oWoU>gA`-@lcvvD{j)-Ndwat9>%zgw*)`DpS1DW zY?BhRn{mJRm(eZFpgYo&-uHOY;s#rVJ=vLCLN2S~{mNMm2yIMsf?N`cC=K2t%7YGw zKYryCl83=@)XWTcj3uJCtY+Vtq*PM-&2J`AimoeOpT-Z~iipEJzTY!I9o%P8(-_Q*Y z(mQ|0E5t>jjYw`5D#gB!JZE0ql^eKzaG2fqV)b85=tIoe#N(qVck5pl8(z=+ciqRU zXf2~Hja3f1`Uk2E>L|?~&0=VW;!65Ao=s6eouO}|B+17pegG{9B80LgGr>Xjz)uiC z4mwDeKrnA`XZ**%IM=t;(^!^7EYJr<03Y`N$DP*z*GCq^dmwL7km04$6&9T3Fm~aM zjgYQu_{#MV&0CV5O9GN@l9Yb@sQ#%CVUhR<-SweeDA;wCl09uYm5zl(5EC=WnLiYC)0c^AmYJLv=d zDO3-VgNtu)OatOV_70&y^1l!GD|~;fM^2r!jYn?^$|A!)W=$+lqJ>5is4s@(iG6+@43zkxad`T6DHw zcRu#HvSyTjO~E7U+2>soz)=@!__F1OL#s$c^t_c|FrfVm@5m%2A}1Pq&gpgeLDqy---a?IjpIW2L%y zeCg@X`)8LwY8?NHF6@uE8?PSqC<^6l6Q+5C`9MPz>Wdb~HlQyXJVGT=HZk90*Pq%C z7jbx4t8I?Y)NJ!1;k?$&I#j_L_G>svK(lQEae^_X(q99pizCE`PpW7C$G=SOw^v#N zOn>LGo#}Gm#Cw7z9eYPyKaAMMZ=4)F^76Bq&YDP4modS~g~|b&-s6Vk6q8|9EC~W7 zTNMFTjkSfwceZ|W2$N}g7Y`*VbrV=d-PMcZ7XWp(qdU0DuXEeTLOws+-1I4e$$NGPN{CMj!Bv&B8~%PCR-W0F3?0ljkmsj$+>Z?J3=GstR-7199SWF$%d z>yWWExkKMhJTur}F0s(yk(JgGsI09KbIVEX>~caK_%K}8x#Wu{Z;M3FAYYu8=ohsA zCL2c`{(J6qcV(wtuY31yCnN6TKzN&5?Q+O!{(REau!(kv+GduPxqQ+RuSM})SzW#x z(pPEqc6t|cH;;elHvuDY~nA(3!2J0 z_YPdXdVKTzIv+c1F+ZE8-00n&*jZmuooDYc`@HO7paL!8bK{K)ec#L7C4#BfZlPN- zyo)!~gP1?67eInh`pg*As6jSL8N~P}^F}BIKnW#*?LZ*`XA~ zyx8^wFDY*ZH2ucUI1hI|jA_{X9k;gM<;GrD-`p>H|KR)km-ThaXZ&r@H#c(=Ih|gH z{tfb;{jy(PE_GN5AOZvL+}_Vl381#tO9M;9X@Q-g9>Ni)4^&*3Aj@qE0$n3`F+-UQ zuM+lncCbDK5daD$xD&KMFiRAkXFOcXUnE_;lP#Esyu^@@y?<|NMe?-zs1OSiSv5Ic zg6GKlQ@w|f zV8xXN>Fo%40uCWW#vlYMku(;p0vLdyPLT6ZtYk4UfExnz*DJV*8!nP7A)jVc6>3hv zYVmBWXQz|i*~pDuQOI9DUpm9L?cXJ5Yvh^&%de?~U<;5OAZ)F|`s!$UxAb`=hg{%H zmT167Hm$Y>o?6QrUF-T*9DM0PL(i1DE~t+HrvT=iO*taKg9@c)FdiGppb>^iHcxifakPPrQCN}UOUM$PMM z$((V7=*eHW(MyA~8ZwY9=zaA466J*_wB2p{DCOn$K&5xlcVc7ikM(^i6m#P@czY;7 z1`P5qk*_~P+O{r4mf`c{b3UD;xsoMP=7eab6eKxM3c;0}nbdcR#s$TuoS?D;C>56N zf1$1p@b5t?N>oN~cV|uBAp4$&y1XoQ0sENMwM1&KD#c7Tyts5k&KRt02C8gXHDFyB z6>D348zoWb>x)~V2rTqp)eZG(It?}8fP(^$c#s2Y|i&$={cM&;kM9m(yMHQYoZHCBe0;3mZEuw|~Z9L)6VCFH;0L?@| zMBrH7)72~;U~3W9Lhu^kEH+QI*G26K5~h&Rj4Eah$U1n#{Kasy38_P{JFO;lfuL0O z!#9vp(=Mo0v+z1<1O_U2>~K{YBRBxjYKNQn8vCMXcYQ2$EtIBMkN@7EnK;$FK6_Yh z8NAj#`{V9WlTAac7?WM%1A3qlWHO6+Z{!j01BNZ@gOMj%GxJ5U$LMu?^jamS5Zn`k zW0;!dA|y@oJD1I)p)eLOJ2|Hely->D)nw)*aKamS!0PP~iU36EF8U45V2cVT7;{VU zbL03$oY^~+&IGoY^qPN?_B>@Q$XQy@1EnOZuCcD(*OpCqjf$m(o{Q}4LeWL?{yy;hXVrS0rh z-N}1gw*xIU|2`}+x;G{8b+0(jio-21Cv24a%DkxhfBb839gL!}OzY!AWl$~d%W<;y z?hJq{hG2P#MgYCvDFaUYEzN7pw7>aPYpL1Ck!fVNdv;X4oN>lspryZ5dEw~7O80A3 zq2dtEqPV}udGt~p>kH|$#c|R!(PDViD;AEVLl%tTe>)aubEfIzB5 z4@&-?4sV7iObhnK36$ZC#l!oCypwLn=b7dsyo~h~>uxuxPhsQTdC51d>^PHL3oo7z zg|qVc=FUhtr{A=);9^-AyWj_whij}FmVXO=eN&@ur8hO9{pD`VRku>r1@GcNI_Yhi z=cP1%d>ZUl$NiDK{)XPOyCgEVxxRqc+v4PW09kLIc~i6o=GX}mK{1s%o2rC`k=XteMqB6nYq$igxE}&e^CA9paDw%=2lmX@G{&O`DVw2Xw(hy1g zL)R|$fxi>grQH+t{K>TUe%k(>0O2n#*~qm?>y#1cTcy1RtDW69KhL(_nvyNQRPe*& zd;Fi{P0E;fc@RvZc`lYVaZMtt?0+1ci9ZwmAIEoLW*CM|!9x&fK}L(B>w| zm9uY|G1uH;M7cwhBSkvQecy_x+#wZ7cYS}pzyIO+cz-^h*X#9uePU6uoV51LV(pdO zCDv5}3xxhE_3bt)7tKseHgN>HafT%u7+Z4~59tB&7m&63^NB`sJz^z`gELP0)23H~ z%%&)MXOqsl-o0Y%wxLj<+HX0>u&e1`sf9QcHz!NgkyWc`-wK9gEyC?u8ang(89~2osEfMh9r?kc`PH`)=1sma)R~& ze>qJJy*Rt^I7M#YX;gG*s~l41M^aLEk!Fhe4#tl9o_y&){x2W#kM9C64mK4VD*)o6 z73{M6|MG|9K+ga1zg#XGqkK4ck6P{RRvRIw-cYgiQi8U^c#h1HSC+gOmizL-L!kb~ zgMxRsrh6R;k)`^oJyPD_T@EmBh}K6r0F+bjs9%TKi(4kg%9e= zLwrjjnB%;}_s?m@I){13zjq<|Qf)rx z&*Ph4&+*r)U>41G*<*6BX1-T_L)V@k)7-IheIz&_Hhotx!{w>nVbX&}^uc9E#AqFY({FczFJ3zqjD8X#cRn}H$lY7@pOKJ zVebU4%AWIDK)D%VKWVd!&Kx<)xa6#ueob-Kz3+;!wzp2l7_Wyml7iAZR;jg#7pyn0nK9ge2zR$8%shif)O59%~_2h2j0CwAa0RE)<*B&PxqpS&o6K{Ym$)evEY;D}MOy^UGuZ&UEp2_(iWgY% zk5L|(w6wh@mNe%!(-u=q>dN;GB=k&_2k8T_P{z6oW+t7Qni#h62%bb@{ zk;&Sf+n{TF-;vvom>-ej|M6eX|K;$+8Tw+(axoVaa5VpgdYAt4U)CQEMZINz*vb)s zeMMce2`NYk=LFIW*xuh%z*rSY5+Xg4UQW z!7xc5q&~axbga7RcS$AhySQrvTO~`0uFS{sMeaW3GdLf4>!oed*Bc&b7LFrLW5Hgg z=dQJ-zikM*`0(Cn*iDyD|K9%f?{NLne3m^sZNg%9XlXda0UiU=7>G`=z%o>-+q=h z4AhiTB7eL7uV}aCUtf>S+7j-5Q7w zm|sUaQKA2K|w^@+(O3`sI(R+X32(_}~h=Gkc{(qySE`Y(cBQaP)qwUrt7Z zDJ+F)Td%#h54yB3d*7CLx45a|wumtdpwhKw)VgSl;kFTy^cU|CVg<3aIaJ7)4 zeMA7FTQG?$txGLhE8zT=d&Cn;>XRmA5sTyqt_LE3XVki6S5cuGLn4hPb2oFhmo9b3 zBGnQ7iW#!+*;2IN zXKd|<@c&c$veEMQ(qp-K0^#0peQn!DF6YUgfyoBbfCW$I%{0Xk_+ZX;LiYw=%2D0J#BQyM*Xg5M#d1gyo@4-*Yv>;2 z%DC|#|8KIsY!S|YmnJKU`lI&Zijks&n_u`Z%O|`SmtcRSw1eqIpU_PiQ{rlYES9brsoq~qUz;y247sKwnY8`sgu=DV069q=fcu|NSJ;;kWXj8u` zYiG`GB)aj~aV$U4x~MTX=B3}vv@O7|RILopKx-i2mE5{|QQu&lqvW~If!I6<%N&g6 zvqizJDe)u%~#(>|!@uLn0aJL@h~fTPpW1XUc@Tk7A6OZG`Wq_?H~xmwa)J-17jO3|&2?t?+i=dJF}E0v zi_XKcJ-qTvK}px-fOuAXBvPd)+1D;ak-f4mg>UTF$e#30Ak?~d;ng{V_tRmSiX{$k z*B%XBSdgJE!6w*SUK^RIJYP4frU9k-pnDp8(Vs?WZk z^Uk>6cS$)r2t3XtVEB_U*-Ok3@4H50&20A5ScYzX_#uG@J>@eh+VGD&>Oiu-eeVL7 z@5xUSQz7JLW0^U=XoL=fRkwe)Ff39!oLVGCgRbaUv0&)_pZq*fXHLNiu(O33ZVKB$-ly~SG zcApz|UzhqU-FK>fz2XpGfHrqzzx}zLq%K^Fi6R9cA^e#C#JMJ(n+(u{S*%(w9;MKUQ-A|Z4jFLHRR_#TtJF8(k%e#z z%6aI~*T_x*4FJ|4K4DwJT3SUE`eX#adZpCTOaroEv@rnfKmNaD9X{7S1zwsu+K;+Z z7FR6hl)d$ZKiqiueTfI{qklQB9$rw!{-mztlVIr3HcQXt&=v)cATPH3RaX7}AWZfg zF!;D~UHi41gU(Y65%rp-pT;NtI<++4YN`9vk18EYL_o|JSvwn6)EPO_RUK*e$ZPUng~&}C?=3Lo7#u++){>{ zv}-KmD#p9K={%dfe1^W4470Cx0?7)}JPa|it~1;UYWaY(VkKxK=w4SD94f;XHS^jI z3V%r>ae1%9ulODN3FsKjo`1#E3z?%$8PYr4a3J|7m~Q2)q#iOKn@2h`}?ItFQ{NrnF*{# zOV;{ZuaFWp>F$_UWjKsS=4xHGbRb+T%>#l9nMQIjA{D$ZT|*83gX=kY<@`oJM*Cv9 z_^r4tKe;1C&FRJQ3+rM<1RO`FzlHHp??CYndb-w(ju3@KxeXn`#`E(0z@_1QLe?6QcM07?99gT$(i? zW%Y<~Rc-ag8MO_CAUKDD6hRMcCQE$a<#j<-Pb+3t$Ok_IolFmFUU(m&&Q|d6=((?@ zF{-8lA|>)*xDbnH>c&mPFxk2P@&7UFaP-7e@M5=Z`#Y|(xSJv(3adx+Up8Un*c;l1 z4XK_0DtU6u=KKpKqR!>Pa@9EzDM7{9cK6JyutRk*Cy86Utui%C$7CvA_v_l{Va4G0 zR(5uOwO3v(y^wU;d!DIfME4HdjbR{lO05{7rR6THXrx}@q(7@3ypX+T&7#t&38<7r zC~&M@@*DTJ^`e_5??X$`AQKA`p532~@@-7!3+4*k}=|dK~ z?QKSnj;n@E%XwkCN{M`qjKs>%4?_ZG$%tJ`_o-Z=H4 zO4H((#)BuC&M~B_8^kZV08xfSVgdlsmD~IM`iV;3F)+;(uz9u1M@TxNAEuKy`n@vP znT-o(gLuyrQXa{^Cii)%dV10`D>{<+Jjn?lX(dKFhuPt+E)&|_0v#ZvaMVIYRlyLb z-(x}2|D6=CWWr&q@$~}mgzAiIfy>H?(;w{LacIF%mN zaIxgq;n5cIy9}xu;0q%FKYM-Vk-F?DJpF{5_(|4fjpGU=RwogWOc<&raLeJ>%LzkQ z)t8ncWZ{_|ZsG?ClCo0~v`Z|UI% zcch?<1QUZNxMiqK7N{Yq!oshus?eDY@a+N|MPIw?3TtyA`J)3qp!JD- zeBy=h>KmfEEu18G%Tp_>nr-VuG#|d~Grmy+%u{2SCnuQBX)Gd#OwprlUDzYp+$*-f z=7poBNVIGqjX8PE;HU(3G&)Ctq7Z1FnTI9E`*@;A0_a0Qh6}b%n1QdDtoB5JE$knN z5SxouePx_;rl62HS?G3Kza7Vur1+rM2iJW9Gz$4xb6Y=S9Gg?l86l8wY(g0x*CZPz4~v)C8+3|HIF_ZPgoe4*p@d)3RI@21%d$iLq|`}+^e zQ_*Fp{VvO)kbTEoq^JN~RDjZDedbn7!fS}BmEEP)a2IE-{E;u!sm-&g$}g5;WwZ~y zf#}t!#9roE?e<@VY3nWP?}Z`u$!;=`XuY+n1c(S!nnq!fkw`9}G6FkJHq3_*DHZ8+ z)lh)6jvQ^xOgS`Jhte~?t{4&8@O*9|{L5xF#8_E4#g!r18Qxr1XBb<3K4b&FKD!yc zaxy$3>hs6O_j@n?=1IQz_GD-0r%fJgO<(h^Mx{^q1N>PvI$(xC$Q7x?0E6*m+(H6P zQFsB6erK~rk4T@UPKcerv!5t+R=D15A*$VlCLwGOze0l80?|bMHme{ntdy{(t`GGyma`))V^C{in^(FFP(q z*D3nvXa39FX75Wq^ge80BicNt?KuBXsQd?Eru~?oJ>0Af@~6sV?6sxn(O=Jlos6^> zE~_^qOLo%=KA6S6sJSw#8u{p*UD2Cn272S?1nX1jFUd%_da}m)?+fs#vG4s!!WJgO zh+z$f(W4Z5Hx@p648ZJ-P_)u%e=(hv!|JnOGRe`H9!|K;R@WRY5in^`E=HVH=O7U& z*=pT?j{OVi^)IphDVeSmj7EYII58c7JCpXkrif8Wv6urWS(SqC0|%RY?-|*dOD{&~ z>W)n}>bzKe5l?a0$M|GVN2twHf2DSdqYbU*Iv@utQN{Pa$_o3{9bWq*{|ys9awGKl zuL*~PkB3QYg$CF4IlQ+eUGvaeV@!ozE~Ob2vAighkUZ{v_C$>Ckn+kJ=()!G+CY83 zkcIAB%hk0qNZocBtc}Y@(t!zaUm366mZhR>3|5^ksPrPT@f){~>lMFNhESS!UCQqghnIegdmHk+ z;iSi$=beSqex~uA5@HrjgsLCLs6n3ngd<66iMgGa636o3D=$Kb{|I4PH+y^UQ_T%@ zCv?T6Wxz6iq^@NuAtCKpCtyzyfznQ~|J_T^uzszO2nd)r(H2e$6{$OVQ5Yox%Tf@~ z`7ZBS?qxqJ5N({oqt^6a{@L&Y|6w*sm%cPP{pgNpc3iQ7sQvoh(fc=T>DVpc$1Os3 zuZ^(ssI3e4)v913uG-7>eBE`e)t*Khm@{m)u;)@NPJgD3x>NE`#Y{x&zSTRy=L^A+ znn}EkD`Pu{f!{R0|Bcd>`Rze}`g>H3uj|u;gfZuAzOWsuALI&rexm>vFMO~$Y-ixSM?AAtsnW2DQB&McDS(`(cou6mJ&(Fc8YXgy{j8A=ans% z<;9_x&y$GS?OTf(+V=Zk_vm)mnC`K2v2!JIjUxw*Ba3g}AKo*o%OK|r|2uj|7=K2u z@>E17{)Ti9WKRj7&wU_)hn^W~t=`Zy>Y^@GHK6X-<+6*GOp{I)O>GMX(36W4oE4+R z9{ZY6>AoU(3K!$tK)FqB^QgK7WF&I~RBSj^m;U({1F>QYh7%3c0MZR@@P zyrpcj;ZhK_W09%#H=V5uT_j6|9jJ{{8y10I_I7VI%zTsl&}gnG{Z;l)}G z6b5TN)_Pu`8AC;s4iGmtJzMab@T8?H$E<(k_wCXFN~2^Mbw%qT^X2347d4d_n#H|J z&J#yv2qMLBF*#y(?F|v{v5J@^#OaWM433IZH5}O>Q03kvM8dQnzqkr#k^ObBWU$>C zCXLKe!oHY`jUDRYkhOI!{2`PKl%1R+RT`GY-*8vGky~1JI_<^Bd$Fj+K7J*W&U07Q z}dbMCS?W_mZVIj?F1+7sL--qTK5Kym7QP4TN_FD51~~OLCY5OSF_=K)ka+ z5jt^ySNN!@Oss{|+b-u;#@Tr8V*4*tX_w?#V+%$RT=0AzGM^@236Nk;>j(~yNMHY9{$rw~6%t5Xi0VKa~>ttp&8Vb_ z9`S$f_$lz>kmthz`S`eEj3{z>k3U>CZT(m&`=fsm+Syx{OQNqb;x4?YsbE6{#ru=K zoZ?ISokkX1i0D(%HoA=Y6gGR?QLeSqPD9L3xtBs>{W2M0f4zP2K|<&UhZD}yY=T25c#O*;saIhCC})%80t zp;SahF5^8tg*A0ksLT+7pEM#Y%P9^=H?9L=_4-md9KSh))u_IvdRQtA;NBDxHVj}U z(d5Y?cQ|^Tg;V1FdFTDZYFCF9_}-{p`6g0HlUyqKZufnEYHXzrdE(B`XA#+70746JL<3<1QEwdr7G?mLaU|ryW-zpJ8DbuM zbW9A6U+Eo~2m2*6OJcQ9yF(w>MC#&A)kQPl`Le_S(in%AFfexuV!(-vCiyuUE(5@1 zTms&~ca6M(u(FRBDSN3Rz7pO&4oI*9b|>`lB4N%)OW7tR)b0GF54HQg%Uyyl-PcBJ zIKC$bsa?r#eBTjjfA#hca3|<>x=WD8g!jE`a~yFt(bWrA7Qbi|5Pp7bd-meiYuA&` z-y}R>Pw>Ln4A(9IzWY)UU!N(ZyNGBdYC)QSB1UUd8YZ5Bt4SFyrdnnuL@UpI#Zf1@ z^EP5X$N}JO1}7k4`?mF_rBV^(GzC2P#e~dB9Hewn*SLzwz`nnE@r?;N`IHMj@Ze0T zCxqy}6%8{_;u>0jJ?lcW=6svhaC2lb>0u%aB5ds${5V-E?A$Y@CXBvojh7>3PT`borO}mBpI4MaLN-YdGE(`0l9Fg6gFZHDB(9BkZf-3u2k%tG6shzYRt|9 znQ(rLWm!L$xE#dMs|Ss&iKq*UCuc`U8)7aDnz^Fhj6kRJYUjo0F>%}Yh<8cp&uC|2Y@60Oj*O0O`$<22 zykI@u_(U1OH@Ff(yGs0H+oMeXb!u~Y{U318E^ohqmZu5Z0q5{BbNUWp^2-mUgD@p{ zt-c0gZ-7^bS~r@4!fPK*Rj(7E3{OY=g2{_SoN_XgD8~)ZjPBYI3^uA7yR9ZbSL487 zeM3x&ZTmGkw3aE}zj%P;Nov78zN4%V6d5v7081$4lA@5=HM)A&?WZlQ7Vnec2l-sFuc3FPB0xH-aX#T(Ubbtzjs@o zqnXh2>dmP2-WlaYb0{63IofSaFpZwVg#sqKy9jsoGZHo(kNRnllx*#I{d1sgjZ&~P z%(+7^*0SI7qF%-gF7-t&R3Bi5mW=S%03}zppr8UGyZsnFtj_u-$k@$LP-@Cql#~dm z0%W^BkhW9EyL?9QxYxG+`#$$?Q^O%^HqL>lD_$W;--6jRhW5D=VSx!*ilwhM{*Er) znTWjm?u_tEqvHuy*IX&{Oe&yvy^i@Xd8-#L2JcJL9i78d6jn|Pc`8|&su0Q9YnO4x zSTYaJ+rpyw|NTGvSzpIbb{yUR!(MXv9qoTPJC%IgJ>s7SeC##*!wQQ)Fj0W$n@lEa z-XCX!q0v2PkTJ=ZSI~1pDt=|p1c$_cuBKj8oT_1zx}N>2*npT`|Kc#b)GGB~n*`dt*l>Yq-b%mN?DGI-m?EnxZGo|;#S#G6 zq>wmRb_qF&h!ZSq4jFRMf}1_cM)L3?XBS>DX)1;f%u)W;31>N4hy(&1yV7%(pJ11V zL2|$_-3<1574DcW!{cND8e2{}PzCR9qBLR-$Au0-aPekS+T7-ld&7+bwy;)@ciWJ7ffhYOlol< zdbOsb$dtQSi8i!xs^3ABxne2ug!pLk%db4&GnOzny#M-^XqQ=j57|ptbWFsA*fg7X z)w{`t45vY09IW0zs@;|XLxcmme2J!%b`K@MBn__X7aNuaHd*Hy)e36BJ!3iiwb&|6 z950VPZZKX|QU_^RpEu|!_;3QTqXbZ}*F1i=r96L3GwnoVkI${AHiHtG+Lu1%{4P9( z|E>DF=8?LAxkBmlC)JOiPK-~iB+rgultQDbpBal(_j>=0>X$UI51jvR{txnh<4>%p||Ef7vEg$iJ7WDaM>3{manA}-;2_Leiq12|g2i(}7fyQAeLW=!dj1U}} z4X3nHi)xIGc%cSfwtF30-IZRa8^O$JupvTQFL74s>L9;HKsr%c&?ColO9heLpLQhF zds3JzI|dnxXOm^*PT#LzN=^cH-i@)e{s-%dK&FIjqF{1!$kR~EXsI6s_YAkA%eO5D z+QLY-1FlkmyJiBx>PiK#)@x?}B3XW_kDh+xeZ9F8e0#sWiQaGS(cNu_@hl-!r<X%)f2wNEmH&cOo=<7_5KF+?Qp7TS> z!T`)*f*^}IC+xritY)84r8I&uG&Kd9#HE7LPLNQAh?@2w6(x_it#8Zm1aSb=#J!|d z0d4>?c@0{Ng(CzrVqpmVhZR|q|3p0UxOeg?(Bu}%Q2T62%Nfs;90OtHh0}fYe!;0z$Txz45KhX5i9 zpoBwdFfU0E%O}T`>HPfs+k2bXyBpp!@p0_5Tb>*@wfvASi%P{_slyj&J4q9UeJr z&Za%5S|W(xb6%o$uJ{`cUME|inn94MWNbb5)xesRvL#vrB0mPzRHvZWss}=qqhh-1 zo~QwtP-xTevJfI3t`&q&!EBnn3%+Ii$NwY#!)4ORBmb+SlS`fwSEM2eS>5HoY@9Y#EPlj) zUEtEAR4war9e=zkuK`fDjG!*$WlZhGuWDoim03|tR3eS+&Y7GU+52wL*lXSMP0iS< z&zF+Am2@_VnbxH$gak;Gb-@UgnL@3)n7NZ2NLYq`C=<$QHa?9Q=hUZ$)4Cz|X>?#J zkf-vlt;Mu-Iolw<-1Dz-RkD6LV1`cv1L;UKw3}KAthU};69{O`Qw@U?^YRqkDt z3zRoIu$eZL^D1V(s#|Qn_3%{PBPdCuq7=bx@poU%0HDxh7#I}`>d3~^P%#+pRE6h7SN1}2sjuyf&2dGIJDw0=To+JX8D)jo z7mPunm^aN)s~8RE-V)Tbob`4a0)p|12N~z^I>tjG0tHjYAQYps^b#5eot1;OfZ8vX zfZB^SAoP~E?LQC$Pe3>j)c3H)NaK}Hd_uE*S>$z znfUwJqv%|(T!7>dx=Riq zCP>+5WM`6?Db9pKwh?@NBUuoBUnXQ)v4HAd3&q-A)KwTI!cB=Z<=NG1KI6(?Kh$~! z_PHO=7@}_T^vQN>p9;Q}d-A-*>$`eiiZ^6sZ~oJ<__U|9s8EV{Dtgj{AkxmM8o^A{J;oI!T2^*f%Pre-PI{I@o5!}srf@&I7S4ls z@aoPVMxktRh6zQagPcuivZfoDs8;aZtP5w2Z+iI-{dqoYl=ph40nyrj*5BVtNvdCS z`A9qC<;quh`rjfK2QGwO_mJuYBCg&%PoEE zIYV|yGQV-ZtjD1EdiZ7OOJk><)|xrYEB2PCt4!NTJHzIR!r2?|&Sk01I6XS?!(yR1 ze|2p(e?8#3!`m7T^Avy29AilQ5;Zo**Ak2ICi5CkDzO3-0{c4dZEVV&WLAw%uM^^( zy9d=Z8s1OBxPrR|&;8mnb9@)@i!Hb%@;WeX zW^Oks=GBPA`A)|?fo4*)RTK98?E-ui^<=i2woMUf`f#c)3Dk6q2+g8rrq%jsgg6B(|)UP>!Aqc%nc|M5SRb$Fh565PpNt*sILKmR84 zANf8hrIn!E*&o*H@L$jh695=AJ6?KeQZV(iJupRi01p2V5kG7Y*jqE);bdx^`waP1 z$L_=6W!p4wNF^lUhQnFO+F+j_K{+OO@liK*gO4RtJX{&ti48E0lySW4+G<%ccGFR= z!L9nO_LF~If2#ym-F|of1zd;)?YnBlq=UN#m(7?#eWL>u&5V`F@nQ@2-Yvy3hmcM4 zG4r71Lf#=fI|?}ONm!N=s0E>aTHCbPSpY1*(RNVMB|Py%{+^&xBQq&r46OhZuVWgI z^)yTzNM~&+@a5@3p1@V4FUV1>p`V2Y?9V!s=?ad7RSkWQe>c~8x=E;#=VxKPX`r2j z&%!I$7s`>zXs(%+%O@RL&)t_NBI`_#{W`os;5E`2I-|1_r=x98ybZwrK1=LSAZ5hq zlvT>tX$h^AR$jeN26qq`dt1@qV2~i)$h>b3a{Et84zK4>w*(t)agqeNet( zn=DxuR3mv!vBAc?ZbKmEyNE+zf$y!%m#_0T8ZFOrrEn(}{CGV7FMv7fSs`WY(sj+V z_R7&iu#6QYm-C-+H9PBliaO#LlMj(m%eq7O3neul6!8y@HwP zew>P8v>t!%fcMz1+JQ<3nbsfX8yYQ7Emkg`oc}!+NBVTz_S+jJlf^QjhmmD!p}wbi z3IcU6$(alfQosB)CZ2Wkti{#nbLjZ!Bl{tMSJZ;`9>D7x2KQ1j_)h7BE3g$p)dWi7 zH}pem4L94x#oXll*K&%@^X&Z87`^HM0;BTMA3E`-^=Jam^n?50HF>dZ}F4e z>lcze% zYp>=w%ol9z3*VV9#W-p|)+zcYW6jT8`s>DaLM9l!R-l*dIe+Y|d~^Gm)CHcHYVr!A zpCa~vs%!7LH+$5`5Xz14Ue?tmqQVB_dGz8{y23DBw$PqtO8**}y*J;r+zZhud5`s9 zqxYGL26boPtGSN~>JiEus)TscR@NOrV1gacUC?@pUl^X#f3-=*CLIdWkb*V_*n1lm z3&>&90etwE{d9TTbQ^*0_+`qQ=q~k@8IaPzbN< zPf$VPwG}yowbL@E=;Q69Cnl%zf@cx3>6h5~`pM5>C zDKv>@yOl*AD42>8)|ov2ftr5Y#uH((w_vhIQ4`{}(^|NwRk> z;V+5TVY;D$>ZNMTR}5SdVVka(!Rh6pfcZ6vs!4fGRrYxRySv_EVXZhC(FFI8XmB&; zI94=2xvm*rs>LZIo^T4vc;=`y&yyd(t7UuPL@H2W9mAoGNWE^+tO*$w7J9@T;WU!C zX#P55e5PwUIEwVTxGkWj>DKde=5fW3ybgMlxeF#sM1TD8f`N#d8j=S(?56~7Vh>L0 zEa4+&4J&^wVYYm_HQ6lxX)j?N6X6OS;kO(`7T9U`_!hQ4lG_ zDLg7tK(w~#r&RKC1A+KZPfvW0H32Jv7P1QIO1)7Jhq7fBD3c{H9jX83|5DZ=FQJqE zc(|f^(}{BAe>pQZH~GWm=`it6D{Z&JoX_n>c-};>nAbyZ>vT{sl6NaIB){f z&8Oxm4u+iA_^OLcaYkcrllO~gUtSrR%kM)A4UMe=QTvcf&aq3Cm@j`tHNMqY`Z?@B77LwzonV zy_NYT0RkycjMZ;dFF1Eb2HHizFU@y6+qo0hJ zK+d5GrDXKCo2j-6iTE@(@bXtar4`+qAP{EnETs&(pCIOCRTS1AS;nL$Nf=?oyw&2% z1cxZxkL>{oS73B=VypSOdptL21~=SX@!peq7x1Rg<_rU%@bk=L9vL>@(ogK2N|Bb% z7k3NR+04)AOf!FM+Qh>XK7}f_b01H{olClU=5Jfs738m+%&FISMXG^>-Ba~MKD)q5 zfaV(hXF$(K5kS8IpS*=hHGxR(mCKv060#UtAaz?b;}ixFxfsIJQ6YfP6ck{6wB7>h znj{aJ`x235;aEIJ{*hd#48N=BDDuWGi?XX4C#(9p57ZTn6ODl=7Ugtc zJUTJSmn4aTKz({>>FK`55vUX`N*OxGCf`3?_O3{K5&p#4T=EaT8iQowu!b6d9Z>lkA)KSA(SU%Wr5tns$2WvYTsjvV&?M_z&U!3Df+V$fu@H8Yd1^8p9tQ zydiy^xHw_>Ii?t&{BVsjWT&BZDm>AUq&_9sdj7#>LZ*xm3_ptRKicBJniIG&I4o@# z@6MAa)b$k4!wJ^b!CwTcJdslo*U;LcPw)zw5~^{Af&}&O@XG|>9xg7Z9&`~8Y{kIU zR#E^*#pX!7deuXIHNVH_Bj7p%N-Y(ei0Zmf#P3*2ODzu=^cp_bqoUCb1UaUEJ~G8T zRf9qd8UAU#NMQJY{jZaka_bs;FPViUqwh8!D}Rb&sPzZE$u>WJVd=$DlxX~GI;`Ws z#i!x#a02jO9;G8kjC)UvuxmJj-}s>s46jsP`-A7>>RH5}dzY`J&wOnMMsyhJ+Ey&T z8462D9py<-k1qTDvm6vpYVDF|;y8c5yF-$D zPvO#6&`Nasqvra)#Kzg@5#1}jA*%|Mq9uE4hcboHykFEGFZZkxs9;+mB|`aV zL7pplnF>7P7r3t!KWdz+Citd#(psI5f@~fM*o5df^2HlXc`7)U22~>!k!`DI*Cb@~ zN689S&L1b63JB=kGsVu$s90G-By}aZI^UM5;EghiE8XV1^TF@Th0nw9aJC1<-YeJd zv4TrnvPNuJ-T2hPG9C0FswnwKSJBy|qU0$mOXikWuT5*baqw5MuaQU@)GmYPkVP=` z$zGrv)`$RDA=mtE*;vvusF}uPe4Z|VZyQP%RMSBeaaYYY-xo#*!vVS5#9Tm!urXruTADJvw|SNv_gKscJO3a52GEj{qx@&lwwr!fLe9~*dM4Nqs$#FM zKt=T4*stFV1+@AW5Iu$ z?iW$Ic)7R_Swat1s;!yFaL3VYQUXPTwV}y_iA7wDDaK?W%9T4MQI*M)6v0+W8V#pa zu^UiMglWm!3hW{^)|B>b{7s@_hbqgu_>Xj|Fw6v3oDDwX`!Hb>)UPh@&KUp*wH)Yb zMe4lZs3N8*yavhw1Pe;aAUs#I(kJ+3@fbv62MUC41;i8!`qfCayLydCBNUdq z0JfAeZy7lNK%f)>^DU_|%2kL}77N}g?hZn7IEBP|p_>vRUErev=cepfZ&k>q9I~Ew z*ZEm?A=-V0JjQ-kb4_YqtQdT~@v{Kmr(-c^B~3fUpE~W0T=?8`U8^z;S)>v{HF zTaQMgCQJJB-&&{{EA+)HTd)je`Y|$0H$xUMRxB}iW7DNVbJM4VaTn|LoD-3MQ6B5F z7oeEL6t;%LNzrhObU?KnNX##Z3I=z@v!T6aH`0g@&j0t{Ze|^_PyFY9kvnS!uyK#& z?6=x?j`E*rexk2wuL&K-&7eRjW3V9-gp)0PeteCSvpS-nI4GKF^ZGa}N|l4dTcDr= z=C@=0;nBn|o%G>~rn-3%yW=&DOsf+=-o5&ECH6idd1t;*q($0$o(KQ6Tbrj%BX;qm zlGqs)(-Tt>L?oS{AV&z{CZtLbbO#CKI~ux=@MI$hJc-lFREX%TrlRW2exzl~bf%&< zQp5qV=tMObGJ9j6Qf}kP#zu}Kv921o?|9k2_vzyUpR#%RkCQ6^?Mb~eg0PhSFoUn< zXb+>UqmuNwt@*%O=$S)5Xy&DuR#W2GaBVS%%Lz zMGPeCmSq+gkW;qdx{9OGGh(_3)vG8%ygw)0MG;rx?P8Ls?KA7#1yp&=sZ$T~;yDYa zRQSk9aWNA42%gN4={Xgw2F&@MX1#;tO>Whl9hFX9%OvKZv4pb4RN&`_3-3EYwjVz{ zHqm+Dsb1m{9C-8j)8Ma?ncr@;Jo5qUb{fAwz|%Dh9uF)M-(ETJUU${}fDjV%RKN!d zRl@b~ge;655BV-$O`L4nFCKvp>qqNelTuU09-20$r%f<5M3l^LUxK+ zHBrH$R!RVrqYx(j13g|a8{=@CQ|96ppyAEcCe!TrT4N1*7Zc%5jhx#rL5Tr!M80K7|P2cy`$rrzT*T-IgM$Bo$cL8JfWHwU_?@VBRt%2GF;Ew~i+zEx1dX~q^f z-Trt!@Xh)0!eiQtZ$4c6HiGVc@cDNQDB)g!(z!d|=4vjb4JexQ58PyENGDqq)EEf# z`++!l_%;jE8GPKFlIg|>#-@cbKcL^Lw=me?evs~Z=;yNWI6 zc7?k84>hmUDq%&MKvLBI=KoLruVfO5zBEl7@$&;5`M-|N{hRzzdTI0MrT_BJpux1G zdKqu><1I50xJ-b2cUL;VFo~FW)6w=5k;K8Kmv0c+4dEgpT;XS65?z7}rxU0lRY zz<14*)-)GS$j*EGRM8Bc>!6#qz58nPJcdQgS{YgXblcqMX7d7?omr%hM1h2go+HFk z9Eu|X(R`2MQ(AfX;uRsD+=9V#ET7HV?QbOCb+nlAIs$3pqR4c`X~>drMR&DySUudF z+~;~j%%;7_lQja`^%4|)4H|Uy4W0YGMv65eX$$4%KcmeFR#QK35tR}G>NMQI1gAg? z&1OLO-t^rYO|!zWR}K=Wh|X#Byl?Pm@5V^@@!n?z1!10FA34Q*{$6&qy+={DZFUZS z44bDa*r6{QUof# zFE_8;RPt3L76m=?w_9N*8JmGvkRY5SiklQDK%)=TkW|xv6Efjd_HVNA`Uz{vg&=Us zL?!qdg?=C4nee^1tM*A|IUqSpD?N+_SClgEugTOomJH$J%uH&gq%1#wyj!L?#&Fy{ zJ?(A;NjXh`S7#;`j6L=bb}>EPc=oZP!}8R+KK>>BlLe}h4MgEJkK3tF zDr(m8tBaRkA>6jZp{0ii{=frdhzn5&*oxTa2E+FgQOUs63=npW%i;-K$ltT7rn@V| z%lGO}s-K)3TttNcF%T6|mnP(u3DMFxk5}O}OIETGY&WvaJIDt>6FxzU^&kJ+SsO{} z|DXRIzVEPc#VSsHg7092oIm@AgHU^l%pf-ece3EFQtioar>DlCv z0Q%=IiDLz+yDJF#^=sO4qcoA*&8 zd>+Nezdj-(Q4%2bGjbzK&PQBWf+csW=*i{u3}cDR|Iu~cZ%O~({|7}xMMXu$k-5bg zAR3w#?uF(~%L+kpWbV|mSK-2i<`!4s$Xz*8(+U?ku-s{xX^w2W+QTosKR2{&Cte`V5?9~%vTbvX_5I>&-c3FFWCMQaj`^?+C4 z@*r%j@Wsf{gU?np$~{jFogH(g4Jk=hy40HKN+$fU*2y2aXz*&Feer?A;+_5D-ySt} zb{QuL3aVcJIg7eleBAQ>QBfG~W2d3D)v~}kZfDo*jo&NeAWl#E)0|CLy5fmZV z!0D~WIXr6CrqjJmLcXKR=wBiZJY>?Vr-S;cHYI6m5^8A0kz_^^E!F5cPjh2_T>M!L z8Dt7lD%YV&i&Btk_W=O%sS_`&P{t`uFp`CDphfgP^g=U*tM5j9zUp>MX&n=2A{~7& z<6O?m;yh=|up4ck*9O<^@(xGL9&?Y0`4lPIKW9B`J`+k4;AMn|;cDEJ)BWWIt-x!t zk=6bD^xM3l#k+8i5TzqCp)LI!DaxN%>q7#m;Kw8M?kwdkx{&;;XeIh-=*a=W;+b25gsX>w zH@b)s=iWe+J^Y?4(R3jgKfB{rMMDoMujSN5X|PM0Vh?VnM4d%Ew>XdXDlej)JS-2_ zB1!n9TCfdN5t^9u;VVqfnq+8dAI(rzW-yk_TOXcA1>(2Uf5w!k@Oo-BT(1!nYFfz` zZ=n(X<)2z?imo>v#wFe#XuV52jN;CJPDZhpx&43oN5*2>$CV&*ddrfS7}L@+Kd^ti zz8O)GHpCRm4N%NluLzs@@7Ob*3{6m{OU+u2y-fKD8|G=L7mxp*?)m<7fZ^VKs6S$D z=HqF%?wC#4yH81(3M((g#dLZ+W?AA_U<>)-~i2j z_YWTAD5b8=Wzm=GUJN;gtG?nPuwvO>{VWQY&S3HwV30Yj6eMv^4~Qr zwd|Bb*FN0-{e;}osde4$R7a@h=h>sDzueyW6CSCOt#hej>f!$1_V1#<%Iry}P}K+Y zy*kVcB5`@*P9HHZ6l6o8280^2CVm=@$`2~% zSy1u3=0Zv1C_{AY8p}){Ex=K9MzuhoTwmQJJ`R>lNub&k)HkKzrA>F>)E6`IX~}KS zl5P14$!sIM*-*kXD0R3*lx%2IFp7{&GxjuoKz2C#Dz-wm*LE!4S7gv0S=Nvt=W%!J zZOEA4H}xOKo3?Jp+`Mt^_UGNX_Y);es5B%mtzRC)mUAT~N}v?2^kvcFxc0r_QgU1l z;Xld4@=b$jyVo9a%ACcZocluPh+uZ#Kro>PEGaX&cY&5*SIX0uu5;YFgOrc6CtvCF)?wCX;e6t%mDRGAk2.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 HH}F3I9Dfpv literal 0 HcmV?d00001 diff --git a/public/sfx/stage-complete.mp3 b/public/sfx/stage-complete.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..43f1b36b29018a7ab02eafd74f43fcce80e38104 GIT binary patch literal 46811 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 EANv2o%m4rY literal 0 HcmV?d00001 diff --git a/public/sfx/success.mp3 b/public/sfx/success.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f1179a3edb6fc8bdf052226698330a27456ca51f GIT binary patch literal 82176 zcmW)nXEfYh7sdZGX4KK!5MtCI$moK|=skKTMz7H#N(7^qAfiMUy+v<9iqU(E-X)^< zgb>2Kp7-PZcGkMTweLRroQu1fQUG9Gqn<@@E#>-{C;GZfm2>*n-#$a~Mb*+IjlvO} zDgaH^n=@gUS1=BTTfO@9lC~#WGWfqk)#T%U>k^eGJHKPB9+??@U|lrp^}Wk^l7aZ@ z-G8HYWQqIDQ8lP9F~t#?nPhVRnWa>bSkI}>plL$=S|9a7u7KR~L$D5`&Xl zcuF2jnLV|`HvSkavAFlhTug@1Dk$V#`H@ zRNSEq-JsXT+C3kM#>TA11+@{@p^=KV`zCNMV^s;1;gcoFXxe)Z*z;ghb}95S+y)y& z^tyGP#^#_9cUEHU5P%5V(;hM7XT26mX(ks*4OyL{p|ZruZ8ik&d<=S7B)uya#!^iW z8Cd=vZr$8asHC*I0V3dm3f`@LhSH#>ja|IV%M<@x_yFPa>wC)s$Oe#)G_7p`ZbU1rNtjlYVp#(Rm1_(6oLM(!UU@A zxPgR3)Gtp*NjJ?$jdPJ^i-IXuYeM##2z!>7av(5>RE3?p(#41&Q0DU4%s!brTYGq< ztkLKVWq;XneQ@F2&zKtA3aM}znno!4dIy_Fgn&Pvo(o?+N?!R@g`eUF>o`yirP!$0r;-q0EisFgA@ADoE6%AXA`S5IUL(H zHA~XzXgMOUX>JY^-rx2s^D7|O4=_e3%N*o|P4`haJ`IHlQUs#bT5_}gKA)j>jLX%w zVoJ1OfI=yin>b*|&xu^|(?n&~FY~HeY>%E7bv~2@zvLFdw3t5uli>FgEmDvX_J@(} zG}G{&t0aLx=JiY*G&&-`+~ua(wPAy1(C#W3vFA4>^PY7MNGZ}sNb%lX`Vlp{;`CLy zltKGSH_q#RV(4MkooLEEb-J!H4{G84W}(u)${RXi;DqpElL%#y#5&Fq8C@5NJ`E|k z7t!sRYBhQp=lo|al9CluEI+!2r4qbDB_E}e3|8*58985l+>kITAMrEfa=qRj|KAm(Kq4-JidF2Oy~U-R8>sZ zytWoZY8Q_G+5$bMOl&V@VLp?3$3`ZqrBjxeRn?kK5c-QEPj2SUw|fr*R1gNvP4>FH z3=Ezw%gcY6p^1?l$rAIjz}$)xTXz;rtr(Vy(DSg&xt`^dzA_ zytMk)F<(T9U{hk;-GX1CIr_G?7f)y;QD2iosMs?=40yING*pCO{B67>;;?XhY)6w# zk-&DNXBvwR?SX;cw=li@sDh%@Qs(wJxrx_{`givSw`}=;=zn4^>qvNSW-Lu=t(&Aw z_VyR+7r5*q_J;cYiVz!@zyg@va2G(G`|6A zlPDGsmcA%w&8iiyhJYhnT%f!7jr6M{xWC4?%#)*>#mh?<%b@eo0?FaV;s5w&2cUm^ zWFiFDfM$W&=@KLWmm^|rEyv)IciOfKqd?@p$;H3go%(Z`F0m?hJ1#`{HOMxjg-4w3 z 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

iAYo5iLNpJ$}&XS_PExg-Ydb^=8W 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

7Ng{r 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 TnmjKDHy0Q1|9$`0{ek}vftlrw literal 0 HcmV?d00001 diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/types/index.ts b/types/index.ts new file mode 100644 index 0000000..d37daa4 --- /dev/null +++ b/types/index.ts @@ -0,0 +1,258 @@ +export interface Artist { + id: number; + name: string; +} + +export interface MusicInfo { + composers: Artist[]; + dj: Artist[]; + artists: Artist[]; + with: Artist[]; + conductor: Artist[]; + remixedBy: Artist[]; + producer: Artist[]; +} + +export interface AlbumGroup { + wikiBody: string; + bbBody: string; + wikiImage: string; + id: number; + name: string; + year: number; + recordLabel: string; + catalogueNumber: string; + releaseType: number; + categoryId: number; + categoryName: string; + time: string; + collages: unknown[] | null; + personalCollages: unknown[] | null; + vanityHouse: boolean; + isBookmarked: boolean; + musicInfo: MusicInfo; + tags: string[]; +} + +export interface TorrentFile { + fileList: string; + filePath: string; + userId: number; + username: string; + id: number; + infoHash: string; + media: string; + format: string; + encoding: string; + remastered: boolean; + remasterYear: number; + remasterTitle: string; + remasterRecordLabel: string; + remasterCatalogueNumber: string; + scene: boolean; + hasLog: boolean; + hasCue: boolean; + logScore: number; + ripLogIds: unknown[]; + fileCount: number; + size: number; + canUseToken: boolean; + seeders: number; + leechers: number; + snatched: number; + has_snatched: boolean; + trumpable: boolean; + trumpable_reasons: unknown[]; + lossyWebApproved: boolean; + lossyMasterApproved: boolean; + freeTorrent: boolean; + isNeutralleech: boolean; + isFreeload: boolean; + reported: boolean; + time: string; + description: string; +} + +export interface AlbumResponse { + group: AlbumGroup; + torrent: TorrentFile; +} + +export interface ApiResponse { + status: string; + response: T; +} + +export interface Track { + filename: string; + title: string; + trackNumber: string; + length?: string; // Duration might be useful +} + +export interface LocalAlbumData { + path: string; + artist: string; + title: string; + year: string; + tracks: Track[]; + coverArtPath?: string; +} + +export interface AudioMetadata { + format: { + sampleRate?: number; + bitsPerSample?: number; + duration?: number; + bitrate?: number; + }; + common: { + title?: string; + artist?: string; + album?: string; + track?: { no: number | null; of: number | null }; + disk?: { no: number | null; of: number | null }; + year?: number; + date?: string; + copyright?: string; + barcode?: string; // UPC + artists?: string[]; + albumartist?: string; + }; + native?: { + tidalUrl?: string; + vorbis?: { id: string; value: any }[]; + }; +} + +export type AnalysisTrack = + | { filename: string; path: string; error: string } + | { + filename: string; + path: string; + format: AudioMetadata['format']; + common: AudioMetadata['common']; + native?: AudioMetadata['native']; + error?: never; + fullPathLength?: number; + }; + +export interface AnalysisResponse { + albumPath: string; + metadata: { + artist: string; + album: string; + year?: number; + upc?: string; + label: string; + tidalUrl?: string; + additionalArtists?: string[]; + releaseType: number; + totalSize: number; + }; + tracks: AnalysisTrack[]; + quality: { + status: string; + mixed: boolean; + details: string; + }; +} + +export type TorrentCreationResponse = + | { + success: true; + output: string; + filename: string; + data: string; + } + | { + success: false; + output: string; + errorOutput: string; + error: string; + }; + +export interface SpectrogramResponse { + results: Record; +} + +export interface CopyResponse { + success: boolean; + destPath: string; +} + +export interface RenameOperation { + original: string; + newName: string; +} + +export interface RenameResult extends RenameOperation { + success: boolean; +} + +export interface BatchRenameResponse { + success: boolean; + results: RenameResult[]; + errors?: string[]; +} + +export interface TorrentInfo { + hash: string; + name: string; + state: string; + progress: number; + size: number; + added_on: number; + completion_on: number; +} + +export interface QbittorrentInjectResponse { + success: boolean; + hash: string; +} + +export interface QbittorrentResumeResponse { + success: boolean; +} + +export interface QbittorrentStatusResponse { + success: boolean; + info: TorrentInfo; +} + +export interface CheckMQAResponse { + success: boolean; + isMQA: boolean; + output: string; +} + +export interface CheckUpconvResponse { + success: boolean; + output: string; + wastedBits: string; +} + +export interface Album { + name: string; + path: string; + hasCover: boolean; + coverPath: string | null; +} + +export interface RenameProposal { + original: string; + strategies: { + remove_brackets: string | null; + remove_parens: string | null; + remove_both: string | null; + truncate: string; + }; +} + +export interface ProposeRenameResponse { + success: boolean; + problematicFiles: RenameProposal[]; + allFiles?: RenameProposal[]; + maxFileLength: number; +} + diff --git a/userscript.js b/userscript.js new file mode 100644 index 0000000..8175063 --- /dev/null +++ b/userscript.js @@ -0,0 +1,353 @@ +// ==UserScript== +// @name Redacted :: Import JSON to Upload Form +// @namespace https://greasyfork.org/en/scripts/393534-redacted-import-json-to-upload-form +// @version 2.0.0 +// @description Adds buttons to attach and parse a .json file from NWCD, OPS, or Crossfade to fill in the upload form. +// @author newstarshipsmell & rewritten by anon28410 for Crossfade +// @include /https://redacted\.sh/upload\.php/ +// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOTSURBVFhH7ZdbSJNhHMY/TTfCusjMtCiaMjFdXmQwL2wX4YgowguDEsGEKIjCSJC8yc4SeeguKI2oC7uolZrK1kkJs1Ir0dKmlkWGh06C0Zmn//9l73pbn+sru3TwY9vzPv/nfeb3bh9qADSDjxgil6gk7hOvCR5mxog24gSRTURNTED7E2JvAwVSCBchNzPKZcKut7HESIGThAg0m81YsyYLpaWVaGpqx8DAKMbHv+P9+2/o7x/B9et3UVJyAk5npvDKOaKKfJoewQrMJvgTICwsDNnZ2/HkySu8ffvFEH19w9iypUAt0kjMoTVNJViBWgIxMbGoqWnG6OhHQXt7HwoKDiM9fS1iYxeIciaTGfPmRSM1dSW2bSvEjRsdfr/Hcw+LFi2RJTxEOOmaZLICfMhog4Vobe3B0NAEentHkJOzQ2zIa3/C4cgUZXmWny2WOLl2ljRNolfASSA83ASXqxmDg+NoaelFQsJSGWCYqKhof4bH04GIiAi5tok0jdEr4CawdWsRvN431P4ZrNZkOfjXREbOxbVrD0VWYWGZ1G/Se40JLLCaoOs5nzZ+ju7uEWRkbJRD/8yyZXZ0dQ2js3MIixf7L0UO5f9WoJpAbu4edNwfQmVlA0JCQuTAlDh4sEpk7io4JrU6ev9LgRm8EBoaStftHh2+F0hLWyfNUyYpKVVkut3d9K0xSX2mWiCVRavVhqbmp6ipe2j4xBvlzNkmkW2zOaS2Wi2Qz6LTuRnuq17k51dI038jL2+fyM7K2i21Q2oBcf237yxHXX0PHKtypEkXE1FC9BMDvtes6XklK1asF9mFRSel1qAW6GSx5KgLFy91ISFxuTTpcoR4E8BeQs8rsViSRHZFRb3UvGoBcWu12zeQMVEaJoU/eWAB1vS8Kpydlu7/an9QC3zziYb41wKBqAWEYLEko/jAedQ3PEZb20u6zb7D2Ngn/4BE7xIUE4E+uueLec5pvfMCpRWXEB9v86+rBT6yULz/AqrPP0CjuzdoAXkI+QAGO4RqgbuUx7nl5Q1y/dNvf4FTVXcMFTCKXgHOl+vTBaYLTBeYLqAW6GPB6C+hUfQKKL+Eg2qB0yzGxSVj775q1F55NFkBB3GMaCGGic8++DVrvMYe4VcLtNweRFmZC/HWFJl1Ti1gJjp8C5Nxi71GYK8ypwf/dz1LeAMGjxPtxFdCHeBAm+oNBnt9M2oGZ3L28Z9eaD8A1I4FiHzaEHoAAAAASUVORK5CYII= +// @grant none +// ==/UserScript== + +(function () { + 'use strict'; + var sourceWebsites = ['NWCD', 'OPS', 'Crossfade']; + var sourceWebsiteDomains = ['notwhat.cd', 'orpheus.network', 'crossfade.local']; + var sourceWebsite, sourceWebsiteIndex; + var JSONReleaseTypes = { + 'NWCD': { + '1': 'Album', '3': 'Soundtrack', '5': 'EP', '6': 'Anthology', '7': 'Compilation', '9': 'Single', '11': 'Live album', '13': 'Remix', '14': 'Bootleg', '15': 'Interview', '16': 'Mixtape', '17': 'Sampler', '21': 'Unknown', '22': 'Demo', '23': 'DJ Mix', '24': 'Concert Recording' + }, + 'OPS': { + '1': 'Album', '3': 'Soundtrack', '5': 'EP', '6': 'Anthology', '7': 'Compilation', '9': 'Single', '11': 'Live album', '13': 'Remix', '14': 'Bootleg', '15': 'Interview', '16': 'Mixtape', '17': 'DJ Mix', '18': 'Concert recording', '21': 'Unknown' + }, + 'Crossfade': { + '1': 'Album', '3': 'Soundtrack', '5': 'EP', '6': 'Anthology', '7': 'Compilation', '9': 'Single', '11': 'Live album', '13': 'Remix', '14': 'Bootleg', '15': 'Interview', '16': 'Mixtape', '17': 'DJ Mix', '18': 'Concert recording', '21': 'Unknown' + } + }; + + var addFormat = /(\?|&)groupid=/.test(location.href) ? true : false; + var uploadRequest = /(\?|&)requestid=/.test(location.href) ? true : false; + + var ChooseTypeDropdown = document.getElementById('categories'); + + var ChooseJSONTR = document.createElement('tr'); + + var ChooseJSONTD = document.createElement('td'); + ChooseJSONTD.classList.add('label'); + ChooseJSONTD.textContent = 'JSON file:'; + + var ChooseJSONBtnTD = document.createElement('td'); + + var ChooseJSONBtn = document.createElement('input'); + ChooseJSONBtn.id = 'json'; + ChooseJSONBtn.type = 'file'; + ChooseJSONBtn.name = 'json_input'; + ChooseJSONBtn.accept = '.application/json,.json'; + + var ChooseJSONPasteBtn = document.createElement('button'); + ChooseJSONPasteBtn.textContent = 'Paste JSON'; + ChooseJSONPasteBtn.type = 'button'; + ChooseJSONPasteBtn.style.marginLeft = '10px'; + ChooseJSONPasteBtn.style.padding = '2px 8px'; + ChooseJSONPasteBtn.style.cursor = 'pointer'; + + ChooseJSONTR.appendChild(ChooseJSONTD); + ChooseJSONTR.appendChild(ChooseJSONBtnTD); + ChooseJSONBtnTD.appendChild(ChooseJSONBtn); + ChooseJSONBtnTD.appendChild(ChooseJSONPasteBtn); + ChooseTypeDropdown.parentNode.parentNode.parentNode.insertBefore(ChooseJSONTR, ChooseTypeDropdown.parentNode.parentNode); + + function processJSON(releaseJSON, filename) { + // Determine source + if (releaseJSON.response && releaseJSON.response.source === 'Crossfade') { + sourceWebsite = 'Crossfade'; + sourceWebsiteIndex = 2; + } else { + sourceWebsiteIndex = /NWCD .+\.json/.test(filename) ? 0 : (/.+(\.opsnet| \[orpheus\.network\])\.json/.test(filename) ? 1 : -1); + sourceWebsite = sourceWebsiteIndex > -1 && sourceWebsiteIndex < sourceWebsites.length ? sourceWebsites[sourceWebsiteIndex] : "N/A"; + } + + if (sourceWebsite == 'N/A') { + alert('The userscript failed to parse a supported website from the json filename or content! Aborting...') + return; + } + + var categories = ['Music', 'Applications', 'E-Books', 'Audiobooks', 'E-Learning Videos', 'Comedy', 'Comics']; + var category = document.getElementById('categories'); + var categoryJSON = parseInt(releaseJSON.response.group.categoryId); + var categoryNameJSON = releaseJSON.response.group.categoryName; + var categoryIndex = categories.indexOf(categoryNameJSON); + + if (categoryIndex > -1) { + if (categoryIndex != 0) { + alert('Currently only Music category torrents are supported. Aborting...'); + return; + } else { + category.selectedIndex = categories.indexOf(categoryNameJSON); + // Trigger change event to load fields + var event = new Event('change'); + category.dispatchEvent(event); + } + } else { + alert('The category name indicated in the JSON (' + categoryNameJSON + ') is not one of the available category types! Aborting...'); + return; + } + + // Wait a bit for fields to load if category changed + setTimeout(function () { + switch (categoryIndex) { + case 0: + if (!addFormat) { + if (!uploadRequest) { + var artists = []; + var artistRoles = [ + { 'name': 'artists', 'index': 0 }, + { 'name': 'with', 'index': 1 }, + { 'name': 'composers', 'index': 2 }, + { 'name': 'conductor', 'index': 3 }, + { 'name': 'dj', 'index': 4 }, + { 'name': 'remixedBy', 'index': 5 }, + { 'name': 'producer', 'index': 6 }, + ]; + var artistsJSON = releaseJSON.response.group.musicInfo; + + for (var i = 0, len = artistRoles.length; i < len; i++) { + if (!artistsJSON[artistRoles[i].name] || artistsJSON[artistRoles[i].name].length == 0) continue; + for (var j = 0, lenj = artistsJSON[artistRoles[i].name].length; j < lenj; j++) { + artists.push({ 'name': artistsJSON[artistRoles[i].name][j].name, 'index': artistRoles[i].index }); + } + } + + if (artists.length > 0) { + var artistInputs = []; + artistInputs.length = artists.length; + for (i = 0, len = artists.length; i < len; i++) { + if (i > 0) { + // Check if AddArtistField exists (it should on upload page) + if (typeof window.AddArtistField === 'function') { + window.AddArtistField(); + } else { + // Fallback for some versions of the site + var addLink = document.querySelector('a[onclick="AddArtistField()"]'); + if (addLink) addLink.click(); + } + } + artistInputs[i] = document.getElementById('artist' + (i > 0 ? '_' + i : '')); + if (artistInputs[i]) { + artistInputs[i].value = artists[i].name; + var roles = document.querySelectorAll('select#importance'); // Changed selector to match typical RED form + if (roles[i]) roles[i].selectedIndex = artists[i].index; + } + } + } else { + // alert('No artists are included in the JSON!'); + } + } + + var albumTitle = document.getElementById('title'); + var albumTitleJSON = releaseJSON.response.group.name; + + if (albumTitleJSON != '') { + albumTitle.value = albumTitleJSON; + } else { + alert('No album title is included in the JSON!'); + } + + var initialYear = document.getElementById('year'); + var initialYearJSON = releaseJSON.response.group.year; + + if (initialYearJSON != '') { + initialYear.value = initialYearJSON; + } else { + alert('No initial year is included in the JSON!'); + } + + var releaseType = document.getElementById('releasetype'); + var releaseTypes = []; + for (i = 0, len = releaseType.options.length; i < len; i++) { + releaseTypes.push(releaseType.options[i].textContent.toLowerCase()); + } + + var releaseTypeIndexJSON = parseInt(releaseJSON.response.group.releaseType || 1); // Default to Album if missing + var releaseTypeNameJSON = JSONReleaseTypes[sourceWebsite][releaseTypeIndexJSON] || 'Album'; + var releaseTypeIndex = releaseTypes.indexOf(releaseTypeNameJSON.toLowerCase()); + + if (releaseTypeIndex > -1) { + releaseType.selectedIndex = releaseTypeIndex; + } + } + + var editionYear = document.getElementById('remaster_year'); + var editionTitle = document.getElementById('remaster_title'); + var editionLabel = document.getElementById('remaster_record_label'); + var editionCatNo = document.getElementById('remaster_catalogue_number'); + var edition = releaseJSON.response.torrent.remastered; + + if (edition) { + var editionYearJSON = releaseJSON.response.torrent.remasterYear; + var editionTitleJSON = releaseJSON.response.torrent.remasterTitle; + var editionLabelJSON = releaseJSON.response.torrent.remasterRecordLabel; + var editionCatNoJSON = releaseJSON.response.torrent.remasterCatalogueNumber; + } else { + editionYearJSON = initialYearJSON ? initialYearJSON : releaseJSON.response.group.year; + editionTitleJSON = ''; + editionLabelJSON = releaseJSON.response.group.recordLabel; + editionCatNoJSON = releaseJSON.response.group.catalogueNumber; + } + + if (editionYear) editionYear.value = editionYearJSON || ''; + if (editionTitle) editionTitle.value = editionTitleJSON || ''; + if (editionLabel) editionLabel.value = editionLabelJSON || ''; + if (editionCatNo) editionCatNo.value = editionCatNoJSON || ''; + + var scene = document.getElementById('scene'); + var sceneJSON = releaseJSON.response.torrent.scene; + if (sceneJSON && scene) scene.checked = true; + + var format = document.getElementById('format'); + var formats = []; + for (i = 0, len = format.options.length; i < len; i++) { + formats.push(format.options[i].textContent.toLowerCase()); + } + + var formatJSON = releaseJSON.response.torrent.format; + var formatIndex = formats.indexOf(formatJSON.toLowerCase()); + + if (formatIndex > -1) { + format.selectedIndex = formatIndex; + } + + var bitrate = document.getElementById('bitrate'); + var bitrates = []; + for (i = 0, len = bitrate.options.length; i < len; i++) { + bitrates.push(bitrate.options[i].textContent.toLowerCase()); + } + var otherBitrate = document.getElementById('other_bitrate'); + var otherBitrateVBR = document.getElementById('vbr'); + + var bitrateJSON = releaseJSON.response.torrent.encoding; + var bitrateIndex = bitrates.indexOf(bitrateJSON.toLowerCase()); + + if (bitrateIndex > -1) { + bitrate.selectedIndex = bitrateIndex; + } else { + var otherIndex = bitrates.indexOf('other'); + if (otherIndex > -1) { + bitrate.selectedIndex = otherIndex; + var span = document.getElementById('other_bitrate_span'); + if (span) span.classList.remove('hidden'); + if (otherBitrate) otherBitrate.value = bitrateJSON.replace(/ \(VBR\)$/i, ''); + if (otherBitrateVBR) otherBitrateVBR.checked = /.+ \(VBR\)$/i.test(bitrateJSON); + } + } + + var media = document.getElementById('media'); + var medias = []; + for (i = 0, len = media.options.length; i < len; i++) { + medias.push(media.options[i].textContent.toLowerCase()); + } + + var mediaJSON = releaseJSON.response.torrent.media; + var mediaIndex = medias.indexOf(mediaJSON.toLowerCase()); + + if (mediaIndex > -1) { + media.selectedIndex = mediaIndex; + } + + if (!addFormat) { + var tags = document.getElementById('tags'); + var tagsJSON = releaseJSON.response.group.tags; + var tagList = ''; + + if (tagsJSON && tagsJSON.length > 0) { + for (i = 0, len = tagsJSON.length; i < len; i++) { + tagList += (i > 0 ? ', ' : '') + tagsJSON[i]; + } + } + + if (tags) tags.value = tagList; + + var image = document.getElementById('image'); + var imageJSON = releaseJSON.response.group.wikiImage; + if (image && imageJSON) image.value = imageJSON; + + var albumDesc = document.getElementById('album_desc'); + var albumDescJSON = releaseJSON.response.group.wikiBBcode ? releaseJSON.response.group.wikiBBcode : releaseJSON.response.group.wikiBody; + + if (albumDescJSON != '') { + if (!releaseJSON.response.group.wikiBBcode) { + // Basic cleanup if needed, but Crossfade provides clean tracklist + } + + if (albumDesc) { + albumDesc.value = albumDescJSON; + // Trigger preview if possible + // document.querySelector('input.button_preview_0').click(); + } + } + } + + var relDesc = document.getElementById('release_desc'); + var relDescJSON = releaseJSON.response.torrent.description; + + if (sourceWebsite !== 'Crossfade') { + var groupIDJSON = releaseJSON.response.group.id; + var torrentIDJSON = releaseJSON.response.torrent.id; + relDescJSON += (relDescJSON ? '\n\n' : '') + 'Cross-posted from ' + sourceWebsite + ': https://'; + relDescJSON += sourceWebsiteDomains[sourceWebsiteIndex] + '/torrents.php?id=' + groupIDJSON + '&torrentid=' + torrentIDJSON; + } + + if (relDesc) relDesc.value = relDescJSON; + + // Show success message + ChooseJSONTR.innerHTML = ''; + var successTD = document.createElement('td'); + successTD.colSpan = 2; + successTD.style.fontWeight = 'bold'; + successTD.style.color = 'green'; + successTD.style.textAlign = 'center'; + successTD.textContent = 'Data imported successfully!'; + ChooseJSONTR.appendChild(successTD); + + break; + } + }, 500); // Delay to allow category change to propagate + } + + ChooseJSONBtn.addEventListener('change', function (evt) { + var file = document.getElementById('json').files[0]; + + if (file) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + var releaseJSON = JSON.parse(evt.target.result); + processJSON(releaseJSON, file.name); + } + reader.onerror = function (evt) { + alert('There was an error reading the file.'); + } + } else { + alert('No JSON file has been chosen!'); + } + }); + + ChooseJSONPasteBtn.addEventListener('click', async function () { + try { + const text = await navigator.clipboard.readText(); + if (!text) { + alert('Clipboard is empty!'); + return; + } + try { + const releaseJSON = JSON.parse(text); + processJSON(releaseJSON, 'clipboard.json'); + } catch (e) { + alert('Failed to parse JSON from clipboard. Make sure you copied the correct content.'); + } + } catch (err) { + alert('Failed to read clipboard: ' + err); + } + }); +})(); \ No newline at end of file