From 11904b872e7f3cf594da8276c97b1fa1e1102e1f Mon Sep 17 00:00:00 2001
From: Priyanshu Bhatnagar <166941540+Priyanshu7354@users.noreply.github.com>
Date: Mon, 18 May 2026 08:09:15 +0530
Subject: [PATCH] Updated UI design
---
.gitignore | 33 +
Backend/RENDER_FIX.md | 128 +
Backend/Routes/group.js | 78 +
Backend/Routes/places.js | 161 +
Backend/db.js | 107 +
Backend/package-lock.json | 1819 ++++++++++
Backend/package.json | 24 +
Backend/render.yaml | 17 +
Backend/server.js | 796 +++++
Backend/vercel.json | 9 +
DEPLOYMENT_CHECKLIST.md | 96 +
DEPLOY_QUICK.md | 178 +
Frontend/README.md | 12 +
Frontend/eslint.config.js | 29 +
Frontend/index.html | 13 +
Frontend/package-lock.json | 4267 +++++++++++++++++++++++
Frontend/package.json | 37 +
Frontend/public/_redirects | 1 +
Frontend/public/vite.svg | 1 +
Frontend/public/worldmap.jpg | Bin 0 -> 5574499 bytes
Frontend/src/App.css | 1 +
Frontend/src/App.jsx | 26 +
Frontend/src/assets/CoordinatorLogo.jsx | 34 +
Frontend/src/assets/react.svg | 1 +
Frontend/src/components/AuthMenu.jsx | 128 +
Frontend/src/components/CallModal.jsx | 372 ++
Frontend/src/components/LiveChat.css | 1536 ++++++++
Frontend/src/components/LiveChat.jsx | 361 ++
Frontend/src/components/MapView.jsx | 636 ++++
Frontend/src/components/SOSOverlay.jsx | 123 +
Frontend/src/context/MapContext.jsx | 525 +++
Frontend/src/context/MapContextCore.js | 3 +
Frontend/src/context/useMap.js | 10 +
Frontend/src/index.css | 2282 ++++++++++++
Frontend/src/main.jsx | 10 +
Frontend/src/pages/HomePage.jsx | 281 ++
Frontend/src/pages/HostRoomPage.jsx | 1157 ++++++
Frontend/src/pages/JoinRoomPage.jsx | 168 +
Frontend/src/pages/MemberRoomPage.css | 695 ++++
Frontend/src/pages/MemberRoomPage.jsx | 745 ++++
Frontend/src/pages/WatchRoomPage.jsx | 174 +
Frontend/src/utils/authStorage.js | 26 +
Frontend/src/utils/locationSmoother.js | 142 +
Frontend/src/utils/placesService.js | 248 ++
Frontend/vercel.json | 8 +
Frontend/vite.config.js | 18 +
GIT_WORKFLOW_GUIDE.md | 246 ++
QUICK_GIT_GUIDE.md | 75 +
README.md | 315 ++
49 files changed, 18152 insertions(+)
create mode 100644 .gitignore
create mode 100644 Backend/RENDER_FIX.md
create mode 100644 Backend/Routes/group.js
create mode 100644 Backend/Routes/places.js
create mode 100644 Backend/db.js
create mode 100644 Backend/package-lock.json
create mode 100644 Backend/package.json
create mode 100644 Backend/render.yaml
create mode 100644 Backend/server.js
create mode 100644 Backend/vercel.json
create mode 100644 DEPLOYMENT_CHECKLIST.md
create mode 100644 DEPLOY_QUICK.md
create mode 100644 Frontend/README.md
create mode 100644 Frontend/eslint.config.js
create mode 100644 Frontend/index.html
create mode 100644 Frontend/package-lock.json
create mode 100644 Frontend/package.json
create mode 100644 Frontend/public/_redirects
create mode 100644 Frontend/public/vite.svg
create mode 100644 Frontend/public/worldmap.jpg
create mode 100644 Frontend/src/App.css
create mode 100644 Frontend/src/App.jsx
create mode 100644 Frontend/src/assets/CoordinatorLogo.jsx
create mode 100644 Frontend/src/assets/react.svg
create mode 100644 Frontend/src/components/AuthMenu.jsx
create mode 100644 Frontend/src/components/CallModal.jsx
create mode 100644 Frontend/src/components/LiveChat.css
create mode 100644 Frontend/src/components/LiveChat.jsx
create mode 100644 Frontend/src/components/MapView.jsx
create mode 100644 Frontend/src/components/SOSOverlay.jsx
create mode 100644 Frontend/src/context/MapContext.jsx
create mode 100644 Frontend/src/context/MapContextCore.js
create mode 100644 Frontend/src/context/useMap.js
create mode 100644 Frontend/src/index.css
create mode 100644 Frontend/src/main.jsx
create mode 100644 Frontend/src/pages/HomePage.jsx
create mode 100644 Frontend/src/pages/HostRoomPage.jsx
create mode 100644 Frontend/src/pages/JoinRoomPage.jsx
create mode 100644 Frontend/src/pages/MemberRoomPage.css
create mode 100644 Frontend/src/pages/MemberRoomPage.jsx
create mode 100644 Frontend/src/pages/WatchRoomPage.jsx
create mode 100644 Frontend/src/utils/authStorage.js
create mode 100644 Frontend/src/utils/locationSmoother.js
create mode 100644 Frontend/src/utils/placesService.js
create mode 100644 Frontend/vercel.json
create mode 100644 Frontend/vite.config.js
create mode 100644 GIT_WORKFLOW_GUIDE.md
create mode 100644 QUICK_GIT_GUIDE.md
create mode 100644 README.md
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..67fbdf07
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+# Dependencies
+node_modules/
+Frontend/node_modules/
+Backend/node_modules/
+
+# Environment variables
+.env
+.env.local
+.env.production
+
+# Build output
+dist/
+build/
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+
+# OS files
+.DS_Store
+Thumbs.db
+
+# Logs
+*.log
+npm-debug.log*
+
+# Test files
+mongodb-test.js
+render.js
+
+about.md
diff --git a/Backend/RENDER_FIX.md b/Backend/RENDER_FIX.md
new file mode 100644
index 00000000..9125ba6f
--- /dev/null
+++ b/Backend/RENDER_FIX.md
@@ -0,0 +1,128 @@
+# Render Deployment Fix Guide
+
+## Problem
+**521 Error** - Render backend is crashing on startup, likely due to MongoDB connection timeout.
+
+## Root Cause
+Your Render server is failing to connect to MongoDB Atlas, causing the entire server to crash before it can listen for requests.
+
+## Solution Steps
+
+### 1️⃣ Add MongoDB URI to Render Environment Variables
+
+1. Go to your Render dashboard: https://dashboard.render.com/
+2. Click on your backend service (`coordinate-dfj5`)
+3. Go to **Environment** tab
+4. Add the following environment variable:
+
+ ```
+ MONGODB_URI=mongodb://aksingh4539047_db_user:ankit45mongo@ac-2zly6wl-shard-00-00.jz1bzub.mongodb.net:27017/?tls=true&authSource=admin&directConnection=true
+ ```
+
+5. Also add (if not already present):
+ ```
+ FRONTEND_URL=https://coordinatev2.vercel.app
+ PORT=5000
+ NODE_ENV=production
+ ```
+
+### 2️⃣ Deploy the Updated Code
+
+Push the latest changes to your Git repository:
+
+```bash
+cd C:\Users\ACER\Desktop\coordinator\Coordinate\Backend
+git add .
+git commit -m "fix: improve MongoDB connection handling for Render"
+git push
+```
+
+Render will automatically redeploy with the new code.
+
+### 3️⃣ Check Render Logs
+
+After deployment, check the logs:
+
+1. Go to Render dashboard
+2. Click on your backend service
+3. Go to **Logs** tab
+4. Look for:
+ - ✅ `🔄 Connecting to MongoDB...`
+ - ✅ `✅ MongoDB Connected Successfully`
+ - ✅ `🚀 Server running on port 5000`
+
+If you see errors, they will tell you exactly what's wrong.
+
+### 4️⃣ Whitelist Render IP (If Needed)
+
+If MongoDB connection still fails:
+
+1. Go to MongoDB Atlas: https://cloud.mongodb.com/
+2. Click **Network Access** in the left sidebar
+3. Click **Add IP Address**
+4. Click **Allow Access From Anywhere** (0.0.0.0/0)
+5. Click **Confirm**
+
+### 5️⃣ Test the Connection
+
+Once deployed, test your backend:
+
+```bash
+# Test API
+curl https://coordinate-dfj5.onrender.com/api/rooms/test
+
+# Check if server is running
+curl -I https://coordinate-dfj5.onrender.com
+```
+
+## What Changed in This Update
+
+1. **Better error handling** - Server won't start if DB connection fails (clear error in logs)
+2. **Connection timeout** - 10-second timeout prevents hanging
+3. **Connection pooling** - Better performance with multiple users
+4. **Health check** - Pings MongoDB to verify connection works
+5. **Render config file** - Added `render.yaml` for easy deployment
+
+## Common Issues
+
+### ❌ "MONGODB_URI is not set"
+**Fix:** Add the environment variable in Render dashboard (Step 1)
+
+### ❌ "MongoNetworkError: failed to connect"
+**Fix:** Whitelist Render's IP in MongoDB Atlas (Step 4)
+
+### ❌ Server starts but Socket.IO still fails
+**Fix:** Make sure your frontend `.env` has the correct Render URL:
+```
+VITE_SOCKET_URL=https://coordinate-dfj5.onrender.com
+```
+
+## Frontend Configuration
+
+In your **Frontend** directory, create/update `.env`:
+
+```env
+VITE_SOCKET_URL=https://coordinate-dfj5.onrender.com
+```
+
+Then redeploy to Vercel:
+```bash
+cd C:\Users\ACER\Desktop\coordinator\Coordinate\Frontend
+vercel --prod
+```
+
+## Testing Locally
+
+```bash
+cd C:\Users\ACER\Desktop\coordinator\Coordinate\Backend
+npm run dev
+```
+
+You should see:
+```
+🔄 Connecting to MongoDB...
+✅ MongoDB Connected Successfully
+🚀 Server running on port 5000
+📍 Frontend URL: https://coordinatev2.vercel.app
+💾 Using MongoDB for persistent storage
+```
diff --git a/Backend/Routes/group.js b/Backend/Routes/group.js
new file mode 100644
index 00000000..81430e6e
--- /dev/null
+++ b/Backend/Routes/group.js
@@ -0,0 +1,78 @@
+// backend/routes/group.js
+import express from 'express';
+import QRcode from 'qrcode';
+import Group from '../models/Group.js';
+import User from '../models/User.js';
+
+const router = express.Router();
+
+router.post('/create', async (req, res) => {
+ const { creatorId, groupName, userName } = req.body;
+ try {
+ let user = await User.findById(creatorId);
+ if (!user) {
+ user = new User({ _id: creatorId, name: userName });
+ await user.save();
+ } else if (userName && user.name !== userName) {
+ user.name = userName;
+ await user.save();
+ }
+ const group = new Group({ name: groupName, creator: creatorId, members: [creatorId] });
+ await group.save();
+ res.json({ groupId: group._id });
+ } catch (error) {
+ res.status(500).json({ error: 'Error creating group' });
+ }
+});
+
+router.post('/join', async (req, res) => {
+ const { groupId, userId, name: userName } = req.body;
+ try {
+ let user = await User.findById(userId);
+ if (!user) {
+ user = new User({ _id: userId, name: userName });
+ await user.save();
+ } else if (userName && user.name !== userName) {
+ user.name = userName;
+ await user.save();
+ }
+ const group = await Group.findById(groupId);
+ if (!group) return res.status(404).json({ error: 'Group not found' });
+ if (!group.members.includes(userId)) {
+ group.members.push(userId);
+ await group.save();
+ }
+ res.json({ success: true });
+ } catch (error) {
+ res.status(500).json({ error: 'Error joining group' });
+ }
+});
+
+router.get('/:groupId/members', async (req, res) => {
+ const { groupId } = req.params;
+ try {
+ const group = await Group.findById(groupId);
+ if (!group) return res.status(404).json({ error: 'Group not found' });
+ const members = await User.find({ _id: { $in: group.members } });
+ res.json(
+ members.map((u) => ({
+ userId: u._id,
+ name: u.name,
+ position: u.location ? [u.location.lat, u.location.lng] : null,
+ }))
+ );
+ } catch (error) {
+ res.status(500).json({ error: 'Error fetching members' });
+ }
+});
+
+router.get('/qr/:groupId', (req, res) => {
+ const { groupId } = req.params;
+ const url = `http://localhost:5173/join/${groupId}`;
+ QRcode.toDataURL(url, (err, dataUrl) => {
+ if (err) return res.status(500).json({ error: 'QR generation error' });
+ res.json({ qr: dataUrl });
+ });
+});
+
+export default router;
\ No newline at end of file
diff --git a/Backend/Routes/places.js b/Backend/Routes/places.js
new file mode 100644
index 00000000..8378b68c
--- /dev/null
+++ b/Backend/Routes/places.js
@@ -0,0 +1,161 @@
+import express from 'express';
+import dotenv from 'dotenv';
+
+dotenv.config();
+
+const router = express.Router();
+router.use(express.json());
+router.use(express.urlencoded({ extended: true }));
+
+const GOOGLE_MAPS_API_KEY = process.env.GOOGLE_MAPS_API_KEY;
+
+router.get('/nearby', async (req, res) => {
+ const { lat, lng, radius = 1000, type } = req.query;
+
+ console.log(`[Places] /nearby request:`, { lat, lng, radius, type });
+
+ if (!lat || !lng) {
+ return res.status(400).json({ error: 'Missing lat or lng' });
+ }
+
+ if (!GOOGLE_MAPS_API_KEY) {
+ console.error('[Places] GOOGLE_MAPS_API_KEY is not set');
+ return res.status(500).json({ error: 'API key not configured' });
+ }
+
+ if (!process.env.NOMINATIM_EMAIL) {
+ return res.status(400).json({ error: 'NOMINATIM_EMAIL is not configured' });
+ }
+
+ try {
+ let url = `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${lat},${lng}&radius=${radius}&key=${GOOGLE_MAPS_API_KEY}`;
+
+ if (type) {
+ url += `&type=${type}`;
+ }
+
+ console.log(`[Places] Calling Google API with type: ${type}`);
+
+ const response = await fetch(url);
+ const contentType = response.headers.get('content-type');
+
+ if (!response.ok) {
+ console.error(`[Places] Google API error: ${response.status}`);
+ return res.status(response.status).json({ error: `Google API error: ${response.status}` });
+ }
+
+ const data = await response.json();
+
+ console.log(`[Places] Google API response status: ${data.status}, results: ${data.results?.length || 0}`);
+
+ res.json(data);
+ } catch (error) {
+ console.error('[Places] Error fetching places:', error);
+ res.status(500).json({ error: 'Failed to fetch places data' });
+ }
+});
+
+router.get('/search', async (req, res) => {
+ const { query, lat, lng, radius = 2000 } = req.query;
+
+ if (!query) {
+ return res.status(400).json({ error: 'Missing query' });
+ }
+
+ try {
+ const searchParams = new URLSearchParams({
+ q: query,
+ format: 'json',
+ addressdetails: '1',
+ limit: '10',
+ });
+
+ if (process.env.NOMINATIM_EMAIL) {
+ searchParams.set('email', process.env.NOMINATIM_EMAIL);
+ }
+
+ const url = `https://nominatim.openstreetmap.org/search?${searchParams.toString()}`;
+ const response = await fetch(url, {
+ headers: {
+ 'User-Agent': `Coordinator/1.0 (contact: ${process.env.NOMINATIM_EMAIL})`,
+ 'Accept-Language': 'en',
+ }
+ });
+
+ if (!response.ok) {
+ console.error('Nominatim error:', response.status);
+ return res.status(response.status).json({ error: 'Nominatim search failed' });
+ }
+
+ const data = await response.json();
+ const results = (data || []).map((item) => ({
+ name: item.display_name?.split(',')[0] || item.display_name || 'Unknown',
+ formatted_address: item.display_name || '',
+ geometry: {
+ location: {
+ lat: Number(item.lat),
+ lng: Number(item.lon),
+ },
+ },
+ place_id: item.place_id,
+ types: item.type ? [item.type] : [],
+ }));
+
+ res.json({ status: 'OK', results });
+ } catch (error) {
+ console.error('Nominatim search error:', error);
+ res.status(500).json({ error: 'Failed to search places' });
+ }
+});
+
+router.get('/directions', async (req, res) => {
+ const { originLat, originLng, destLat, destLng } = req.query;
+
+ if (!originLat || !originLng || !destLat || !destLng) {
+ return res.status(400).json({ error: 'Missing coordinates' });
+ }
+
+ try {
+ const osrmUrl = `https://router.project-osrm.org/route/v1/driving/${originLng},${originLat};${destLng},${destLat}?overview=full&geometries=polyline`;
+ const response = await fetch(osrmUrl);
+ const data = await response.json();
+
+ if (data.code === 'Ok' && data.routes?.[0]) {
+ return res.json({
+ routes: [{
+ overview_polyline: {
+ points: data.routes[0].geometry
+ },
+ legs: data.routes[0].legs
+ }],
+ status: 'OK'
+ });
+ }
+ res.status(500).json({ error: 'OSRM routing failed' });
+ } catch (error) {
+ console.error('OSRM Directions error:', error);
+ res.status(500).json({ error: 'Failed to fetch directions' });
+ }
+});
+
+router.get('/details', async (req, res) => {
+ const { placeId } = req.query;
+
+ if (!placeId || !GOOGLE_MAPS_API_KEY) {
+ return res.status(400).json({ error: 'Missing placeId or API key' });
+ }
+
+ try {
+ const url = `https://maps.googleapis.com/maps/api/place/details/json?place_id=${placeId}&key=${GOOGLE_MAPS_API_KEY}`;
+
+ const response = await fetch(url);
+ const data = await response.json();
+
+ res.json(data);
+ } catch (error) {
+ console.error('Google Place Details API error:', error);
+ res.status(500).json({ error: 'Failed to fetch place details' });
+ }
+});
+
+export default router;
\ No newline at end of file
diff --git a/Backend/db.js b/Backend/db.js
new file mode 100644
index 00000000..7189b255
--- /dev/null
+++ b/Backend/db.js
@@ -0,0 +1,107 @@
+// backend/db.js
+import { MongoClient } from 'mongodb';
+import dotenv from 'dotenv';
+
+dotenv.config();
+
+const uri = process.env.MONGODB_URI;
+
+if (!uri) {
+ console.warn('⚠️ MONGODB_URI is not set in environment variables');
+ console.warn(' Will use in-memory storage (data lost on restart)');
+}
+
+let client;
+let db;
+let roomsCollection;
+let usersCollection;
+let tripsCollection;
+let isConnected = false;
+
+export async function connectDB() {
+ if (!uri) {
+ console.log('💾 Using in-memory storage (no MongoDB URI provided)');
+ return null;
+ }
+
+ try {
+ console.log('🔄 Connecting to MongoDB...');
+ client = new MongoClient(uri, {
+ serverSelectionTimeoutMS: 5000,
+ connectTimeoutMS: 5000,
+ maxPoolSize: 10,
+ });
+
+ await client.connect();
+
+ // Test the connection
+ await client.db().admin().ping();
+
+ db = client.db('coordinate');
+ roomsCollection = db.collection('rooms');
+ usersCollection = db.collection('users');
+ tripsCollection = db.collection('trips');
+
+ // Create indexes for better performance
+ try {
+ await roomsCollection.createIndex({ roomId: 1 }, { unique: true });
+ await roomsCollection.createIndex({ 'members.userId': 1 });
+ await usersCollection.createIndex({ googleSub: 1 }, { unique: true });
+ await usersCollection.createIndex({ email: 1 });
+ await tripsCollection.createIndex({ userId: 1 });
+ await tripsCollection.createIndex({ createdAt: -1 });
+ } catch (indexErr) {
+ console.warn('⚠️ Index creation failed (non-critical):', indexErr.message);
+ }
+
+ isConnected = true;
+ console.log('✅ MongoDB Connected Successfully');
+ return db;
+ } catch (err) {
+ console.error('❌ MongoDB Connection Failed:', err.message);
+ console.warn('⚠️ Will use in-memory storage instead');
+ isConnected = false;
+ return null;
+ }
+}
+
+export function getDB() {
+ return db;
+}
+
+export function getRoomsCollection() {
+ if (!isConnected || !roomsCollection) {
+ return null;
+ }
+ return roomsCollection;
+}
+
+export function getUsersCollection() {
+ if (!isConnected || !usersCollection) {
+ return null;
+ }
+ return usersCollection;
+}
+
+export function getTripsCollection() {
+ if (!isConnected || !tripsCollection) {
+ return null;
+ }
+ return tripsCollection;
+}
+
+export function isDBConnected() {
+ return isConnected;
+}
+
+export async function closeDB() {
+ if (client && isConnected) {
+ try {
+ await client.close();
+ isConnected = false;
+ console.log('🔌 MongoDB Connection Closed');
+ } catch (err) {
+ console.error('Error closing MongoDB:', err.message);
+ }
+ }
+}
diff --git a/Backend/package-lock.json b/Backend/package-lock.json
new file mode 100644
index 00000000..149136b4
--- /dev/null
+++ b/Backend/package-lock.json
@@ -0,0 +1,1819 @@
+{
+ "name": "backend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "backend",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "cors": "^2.8.5",
+ "dotenv": "^17.2.1",
+ "express": "^5.1.0",
+ "google-auth-library": "^9.15.1",
+ "mongodb": "^7.1.1",
+ "qrcode": "^1.5.4",
+ "socket.io": "^4.8.1"
+ }
+ },
+ "node_modules/@mongodb-js/saslprep": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz",
+ "integrity": "sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==",
+ "license": "MIT",
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.19",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
+ "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
+ "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.10.0"
+ }
+ },
+ "node_modules/@types/webidl-conversions": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
+ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz",
+ "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "license": "MIT",
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/bson": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-7.2.0.tgz",
+ "integrity": "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "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==",
+ "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/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "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/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dijkstrajs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
+ "license": "MIT"
+ },
+ "node_modules/dotenv": {
+ "version": "17.2.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz",
+ "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "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==",
+ "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/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/engine.io": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",
+ "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.7.2",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/engine.io/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gaxios": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "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==",
+ "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-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/google-auth-library": {
+ "version": "9.15.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^6.1.1",
+ "gcp-metadata": "^6.1.0",
+ "gtoken": "^7.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gtoken": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+ "license": "MIT",
+ "dependencies": {
+ "gaxios": "^6.0.0",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "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/memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "license": "MIT"
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mongodb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz",
+ "integrity": "sha512-067DXiMjcpYQl6bGjWQoTUEE9UoRViTtKFcoqX7z08I+iDZv/emH1g8XEFiO3qiDfXAheT5ozl1VffDTKhIW/w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@mongodb-js/saslprep": "^1.3.0",
+ "bson": "^7.1.1",
+ "mongodb-connection-string-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-providers": "^3.806.0",
+ "@mongodb-js/zstd": "^7.0.0",
+ "gcp-metadata": "^7.0.1",
+ "kerberos": "^7.0.0",
+ "mongodb-client-encryption": ">=7.0.0 <7.1.0",
+ "snappy": "^7.3.2",
+ "socks": "^2.8.6"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-providers": {
+ "optional": true
+ },
+ "@mongodb-js/zstd": {
+ "optional": true
+ },
+ "gcp-metadata": {
+ "optional": true
+ },
+ "kerberos": {
+ "optional": true
+ },
+ "mongodb-client-encryption": {
+ "optional": true
+ },
+ "snappy": {
+ "optional": true
+ },
+ "socks": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mongodb-connection-string-url": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz",
+ "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/whatwg-url": "^13.0.0",
+ "whatwg-url": "^14.1.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "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/negotiator": {
+ "version": "0.6.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch/node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/node-fetch/node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
+ "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+ "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz",
+ "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "dijkstrajs": "^1.0.1",
+ "pngjs": "^5.0.0",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "qrcode": "bin/qrcode"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "license": "ISC"
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/send": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/send/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/send/node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "license": "ISC"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "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==",
+ "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==",
+ "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==",
+ "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==",
+ "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/socket.io": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
+ "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
+ }
+ },
+ "node_modules/socket.io-adapter/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz",
+ "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.10.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
+ "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
+ "license": "MIT"
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^5.1.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "license": "ISC"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "license": "ISC"
+ },
+ "node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/Backend/package.json b/Backend/package.json
new file mode 100644
index 00000000..5bc7d912
--- /dev/null
+++ b/Backend/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "backend",
+ "version": "1.0.0",
+ "type": "module",
+ "main": "server.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "start": "node server.js",
+ "dev": "node --watch server.js"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "dependencies": {
+ "cors": "^2.8.5",
+ "dotenv": "^17.2.1",
+ "express": "^5.1.0",
+ "google-auth-library": "^9.15.1",
+ "mongodb": "^7.1.1",
+ "qrcode": "^1.5.4",
+ "socket.io": "^4.8.1"
+ }
+}
diff --git a/Backend/render.yaml b/Backend/render.yaml
new file mode 100644
index 00000000..a09e0772
--- /dev/null
+++ b/Backend/render.yaml
@@ -0,0 +1,17 @@
+services:
+ - type: web
+ name: coordinate-backend
+ env: node
+ region: oregon
+ plan: free
+ buildCommand: npm install
+ startCommand: node server.js
+ envVars:
+ - key: NODE_ENV
+ value: production
+ - key: PORT
+ value: 5000
+ - key: FRONTEND_URL
+ sync: false
+ - key: MONGODB_URI
+ sync: false
diff --git a/Backend/server.js b/Backend/server.js
new file mode 100644
index 00000000..75476d47
--- /dev/null
+++ b/Backend/server.js
@@ -0,0 +1,796 @@
+// backend/server.js
+import express from 'express';
+import http from 'http';
+import { Server } from 'socket.io';
+import cors from 'cors';
+import QRCode from 'qrcode';
+import crypto from 'crypto';
+import dotenv from 'dotenv';
+import { OAuth2Client } from 'google-auth-library';
+import { connectDB, getRoomsCollection, getTripsCollection, getUsersCollection, isDBConnected } from './db.js';
+import placesRoutes from './Routes/places.js';
+
+dotenv.config();
+
+const app = express();
+const server = http.createServer(app);
+const io = new Server(server, {
+ cors: {
+ origin: [
+ 'http://localhost:5173',
+ 'http://localhost:5174',
+ 'http://localhost:5175',
+ 'http://127.0.0.1:5173',
+ 'http://127.0.0.1:5174',
+ 'http://127.0.0.1:5175',
+ 'https://coordinatev2.vercel.app',
+ process.env.FRONTEND_URL,
+ /https:\/\/.*\.vercel\.app$/,
+ /https:\/\/.*\.onrender\.com$/,
+ /https:\/\/.*\.ngrok-free\.dev$/,
+ ].filter(Boolean),
+ methods: ['GET', 'POST'],
+ credentials: true,
+ },
+ maxHttpBufferSize: 10e6,
+});
+
+app.use(cors({
+ origin: [
+ 'http://localhost:5173',
+ 'http://localhost:5174',
+ 'http://localhost:5175',
+ 'http://127.0.0.1:5173',
+ 'http://127.0.0.1:5174',
+ 'http://127.0.0.1:5175',
+ 'https://coordinatev2.vercel.app',
+ process.env.FRONTEND_URL,
+ /https:\/\/.*\.vercel\.app$/,
+ /https:\/\/.*\.onrender\.com$/,
+ /https:\/\/.*\.ngrok-free\.dev$/,
+ ].filter(Boolean),
+ credentials: true,
+}));
+app.use(express.json());
+
+// Google Places API routes
+app.use('/api/places', placesRoutes);
+
+// Google Auth - verify ID token and upsert user
+app.post('/api/auth/google', async (req, res) => {
+ try {
+ const { idToken } = req.body || {};
+ const payload = await verifyGoogleToken(idToken);
+
+ if (!payload) {
+ return res.status(401).json({ error: 'Invalid Google token' });
+ }
+
+ if (!isDBConnected()) {
+ return res.status(503).json({ error: 'Database unavailable' });
+ }
+
+ const usersCollection = getUsersCollection();
+ const userDoc = {
+ googleSub: payload.sub,
+ name: payload.name,
+ email: payload.email,
+ picture: payload.picture,
+ lastLoginAt: new Date(),
+ updatedAt: new Date(),
+ };
+
+ await usersCollection.updateOne(
+ { googleSub: payload.sub },
+ { $set: userDoc, $setOnInsert: { createdAt: new Date() } },
+ { upsert: true }
+ );
+
+ res.json({
+ success: true,
+ user: {
+ id: payload.sub,
+ name: payload.name,
+ email: payload.email,
+ picture: payload.picture,
+ },
+ });
+ } catch (err) {
+ console.error('Auth error:', err);
+ res.status(500).json({ error: 'Authentication failed' });
+ }
+});
+
+// Save trip route (requires Google ID token)
+app.post('/api/trips', async (req, res) => {
+ try {
+ const authHeader = req.headers.authorization || '';
+ const idToken = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : null;
+ const payload = await verifyGoogleToken(idToken);
+
+ if (!payload) {
+ return res.status(401).json({ error: 'Unauthorized' });
+ }
+
+ if (!isDBConnected()) {
+ return res.status(503).json({ error: 'Database unavailable' });
+ }
+
+ const {
+ roomId,
+ tripName,
+ startLocation,
+ endLocation,
+ targetLocation,
+ path,
+ startedAt,
+ endedAt,
+ durationMs,
+ } = req.body || {};
+
+ if (!tripName || !startLocation || !endLocation || !Array.isArray(path) || path.length < 2) {
+ return res.status(400).json({ error: 'Invalid trip data' });
+ }
+
+ const tripsCollection = getTripsCollection();
+
+ const doc = {
+ userId: payload.sub,
+ userEmail: payload.email,
+ roomId: (roomId || '').toUpperCase(),
+ tripName,
+ startLocation,
+ endLocation,
+ targetLocation: targetLocation || null,
+ path,
+ startedAt: startedAt ? new Date(startedAt) : new Date(),
+ endedAt: endedAt ? new Date(endedAt) : new Date(),
+ durationMs: typeof durationMs === 'number' ? durationMs : null,
+ createdAt: new Date(),
+ };
+
+ const result = await tripsCollection.insertOne(doc);
+ res.json({ success: true, tripId: result.insertedId });
+ } catch (err) {
+ console.error('Trip save error:', err);
+ res.status(500).json({ error: 'Failed to save trip' });
+ }
+});
+
+// Hybrid storage: MongoDB + in-memory cache for real-time Socket.IO operations
+const rooms = new Map(); // roomId -> room data (cache)
+const userSockets = new Map(); // userId -> socketId
+const userRooms = new Map(); // userId -> roomId
+const googleClient = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
+
+function getDefaultRoomSettings(mode = "crowd") {
+ return {
+ mode,
+ trackingRange: 30,
+ targetLocation: null,
+ targetLabel: null,
+ mapStyle: "osm",
+ };
+}
+
+async function verifyGoogleToken(idToken) {
+ if (!idToken || !process.env.GOOGLE_CLIENT_ID) {
+ return null;
+ }
+
+ try {
+ const ticket = await googleClient.verifyIdToken({
+ idToken,
+ audience: process.env.GOOGLE_CLIENT_ID,
+ });
+ return ticket.getPayload();
+ } catch (err) {
+ console.error('Google token verification failed:', err.message);
+ return null;
+ }
+}
+
+// Helper: Calculate distance between two coordinates (Haversine formula)
+function calculateDistance(lat1, lng1, lat2, lng2) {
+ const R = 6371e3; // Earth's radius in meters
+ const φ1 = lat1 * Math.PI / 180;
+ const φ2 = lat2 * Math.PI / 180;
+ const Δφ = (lat2 - lat1) * Math.PI / 180;
+ const Δλ = (lng2 - lng1) * Math.PI / 180;
+
+ const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
+ Math.cos(φ1) * Math.cos(φ2) *
+ Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+
+ return R * c; // Distance in meters
+}
+
+// Helper: Safely execute MongoDB operation with fallback
+async function safeMongoOperation(operation, fallback) {
+ if (!isDBConnected()) {
+ return fallback();
+ }
+
+ try {
+ return await operation();
+ } catch (err) {
+ console.warn('⚠️ MongoDB operation failed, using fallback:', err.message);
+ return fallback();
+ }
+}
+
+async function getRoomFromCacheOrDb(roomId) {
+ let room = rooms.get(roomId);
+ if (room) return room;
+
+ room = await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ const foundRoom = await roomsCollection.findOne({ roomId });
+ if (foundRoom) {
+ rooms.set(roomId, foundRoom);
+ }
+ return foundRoom;
+ },
+ () => null
+ );
+
+ return room;
+}
+
+// API Routes
+
+// Create a new room (Host)
+app.post('/api/rooms/create', async (req, res) => {
+ try {
+ const { hostId, hostName, mode } = req.body;
+ if (!hostId || !hostName) {
+ return res.status(400).json({ error: 'hostId and hostName are required' });
+ }
+
+ const normalizedMode = ["crowd", "tracking", "trip"].includes(mode) ? mode : "crowd";
+
+ const roomId = crypto.randomUUID().slice(0, 8).toUpperCase();
+ const room = {
+ roomId,
+ hostId,
+ hostName,
+ members: [],
+ createdAt: Date.now(),
+ isActive: true,
+ settings: getDefaultRoomSettings(normalizedMode),
+ };
+
+ // Save to MongoDB (with safe fallback)
+ await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ await roomsCollection.insertOne(room);
+ },
+ () => {
+ console.log('💾 Saving room to in-memory storage');
+ }
+ );
+
+ // Add to cache
+ rooms.set(roomId, room);
+
+ // Generate QR code with join URL
+ const joinUrl = `${process.env.FRONTEND_URL || 'http://localhost:5173'}/join/${roomId}`;
+ const qrCode = await QRCode.toDataURL(joinUrl);
+
+ res.json({
+ success: true,
+ roomId,
+ qrCode,
+ joinUrl,
+ settings: room.settings,
+ });
+ } catch (err) {
+ console.error('Error creating room:', err);
+ res.status(500).json({ error: 'Failed to create room' });
+ }
+});
+
+// Join a room (Mobile users)
+app.post('/api/rooms/join', async (req, res) => {
+ try {
+ const { userId, userName, role } = req.body;
+ const roomId = (req.body.roomId || "").toUpperCase();
+ if (!roomId || !userId || !userName) {
+ return res.status(400).json({ error: 'roomId, userId, and userName are required' });
+ }
+
+ let room = rooms.get(roomId);
+
+ // If not in cache, try MongoDB
+ if (!room) {
+ room = await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ const foundRoom = await roomsCollection.findOne({ roomId });
+ if (foundRoom) {
+ rooms.set(roomId, foundRoom);
+ }
+ return foundRoom;
+ },
+ () => null
+ );
+ }
+
+ if (!room) {
+ return res.status(404).json({ error: 'Room not found' });
+ }
+
+ if (!room.isActive) {
+ return res.status(400).json({ error: 'Room is no longer active' });
+ }
+
+ const isTripMode = room.settings?.mode === 'trip';
+ const normalizedRole = isTripMode && userId !== room.hostId ? 'watcher' : 'member';
+ const requestedRole = role === 'watcher' && isTripMode ? 'watcher' : normalizedRole;
+
+ // Check if user already in room
+ let memberIndex = room.members.findIndex(m => m.userId === userId);
+ if (memberIndex !== -1) {
+ room.members[memberIndex].name = userName;
+ room.members[memberIndex].role = room.members[memberIndex].role || requestedRole;
+ room.members[memberIndex].lastUpdate = Date.now();
+ } else {
+ room.members.push({
+ userId,
+ name: userName,
+ role: requestedRole,
+ location: { lat: 0, lng: 0 },
+ lastUpdate: Date.now(),
+ });
+ }
+
+ // Update MongoDB (with safe fallback)
+ await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ await roomsCollection.updateOne(
+ { roomId },
+ { $set: { members: room.members } }
+ );
+ },
+ () => console.log('💾 Updated room in in-memory storage')
+ );
+
+ // Update cache
+ rooms.set(roomId, room);
+
+ res.json({
+ success: true,
+ room: {
+ roomId: room.roomId,
+ hostId: room.hostId,
+ hostName: room.hostName,
+ role: requestedRole,
+ settings: room.settings || getDefaultRoomSettings(),
+ }
+ });
+ } catch (err) {
+ console.error('Error joining room:', err);
+ res.status(500).json({ error: 'Failed to join room' });
+ }
+});
+
+// Get room details
+app.get('/api/rooms/:roomId', async (req, res) => {
+ try {
+ const roomId = (req.params.roomId || "").toUpperCase();
+ let room = rooms.get(roomId);
+
+ // If not in cache, try MongoDB
+ if (!room) {
+ room = await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ const foundRoom = await roomsCollection.findOne({ roomId });
+ if (foundRoom) {
+ rooms.set(roomId, foundRoom);
+ }
+ return foundRoom;
+ },
+ () => null
+ );
+ }
+
+ if (!room) {
+ return res.status(404).json({ error: 'Room not found' });
+ }
+
+ const membersWithLocation = room.members.map(member => ({
+ userId: member.userId,
+ name: member.name,
+ location: member.location,
+ lastUpdate: member.lastUpdate,
+ role: member.role || 'member',
+ }));
+
+ res.json({
+ success: true,
+ room: {
+ roomId: room.roomId,
+ hostId: room.hostId,
+ hostName: room.hostName,
+ members: membersWithLocation,
+ settings: room.settings || getDefaultRoomSettings(),
+ }
+ });
+ } catch (err) {
+ console.error('Error fetching room:', err);
+ res.status(500).json({ error: 'Failed to fetch room details' });
+ }
+});
+
+// Leave room
+app.post('/api/rooms/:roomId/leave', async (req, res) => {
+ try {
+ const { roomId } = req.params;
+ const { userId } = req.body;
+
+ let room = rooms.get(roomId);
+
+ if (!room) {
+ return res.status(404).json({ error: 'Room not found' });
+ }
+
+ room.members = room.members.filter(m => m.userId !== userId);
+
+ // Delete room if empty
+ if (room.members.length === 0) {
+ await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ await roomsCollection.deleteOne({ roomId });
+ },
+ () => console.log('💾 Deleted room from in-memory storage')
+ );
+ rooms.delete(roomId);
+ } else {
+ // Update in MongoDB (with safe fallback)
+ await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ await roomsCollection.updateOne(
+ { roomId },
+ { $set: { members: room.members } }
+ );
+ },
+ () => console.log('💾 Updated room in in-memory storage')
+ );
+ // Update cache
+ rooms.set(roomId, room);
+ }
+
+ res.json({ success: true });
+ } catch (err) {
+ console.error('Error leaving room:', err);
+ res.status(500).json({ error: 'Failed to leave room' });
+ }
+});
+
+// Socket.IO for real-time updates
+io.on('connection', (socket) => {
+ console.log('🔌 User connected:', socket.id);
+
+ // User joins with their ID
+ socket.on('user:join', ({ userId, roomId }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ if (!normalizedRoomId) return;
+ userSockets.set(userId, socket.id);
+ userRooms.set(userId, normalizedRoomId);
+ socket.join(normalizedRoomId);
+ console.log(`User ${userId} joined room ${normalizedRoomId}`);
+ });
+
+ // Update user location
+ socket.on('location:update', async ({ userId, roomId, lat, lng, name }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ let room = rooms.get(normalizedRoomId);
+ if (room) {
+ // Update in cache
+ let member = room.members.find(m => m.userId === userId);
+ if (member && member.role === 'watcher') {
+ return;
+ }
+ if (member) {
+ member.location = { lat, lng };
+ member.lastUpdate = Date.now();
+ member.name = name;
+ } else {
+ room.members.push({
+ userId,
+ name,
+ role: userId === room.hostId ? 'host' : 'member',
+ location: { lat, lng },
+ lastUpdate: Date.now(),
+ });
+ }
+
+ // Update MongoDB asynchronously (don't wait)
+ if (isDBConnected()) {
+ const roomsCollection = getRoomsCollection();
+ roomsCollection.updateOne(
+ { roomId },
+ { $set: { members: room.members } }
+ ).catch(err => console.error('Error updating location in DB:', err.message));
+ }
+
+ // Update cache
+ rooms.set(roomId, room);
+
+ // Broadcast to all in room
+ io.to(normalizedRoomId).emit('location:updated', {
+ userId,
+ name,
+ lat,
+ lng,
+ timestamp: Date.now(),
+ });
+ }
+ });
+
+ // Get all current locations in room
+ socket.on('room:sync', async ({ roomId }, callback) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ let room = rooms.get(normalizedRoomId);
+
+ // If not in cache, fetch from MongoDB
+ if (!room) {
+ room = await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ const foundRoom = await roomsCollection.findOne({ roomId: normalizedRoomId });
+ if (foundRoom) {
+ rooms.set(normalizedRoomId, foundRoom);
+ }
+ return foundRoom;
+ },
+ () => null
+ );
+ }
+
+ if (!room) {
+ callback({ error: 'Room not found' });
+ return;
+ }
+
+ const locations = room.members
+ .filter(m => m.location && m.location.lat !== 0 && m.location.lng !== 0)
+ .map(m => ({
+ userId: m.userId,
+ name: m.name,
+ lat: m.location.lat,
+ lng: m.location.lng,
+ isHost: m.userId === room.hostId,
+ }));
+
+ callback({
+ success: true,
+ locations,
+ hostId: room.hostId,
+ settings: room.settings || getDefaultRoomSettings(),
+ });
+ });
+
+ socket.on('room:settings:update', async ({ roomId, userId, settings }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ let room = rooms.get(normalizedRoomId);
+ if (!room) return;
+ const isHost = userId === room.hostId;
+ const isTripMode = room.settings?.mode === 'trip';
+
+ if (settings && Object.prototype.hasOwnProperty.call(settings, 'mode')) {
+ delete settings.mode;
+ }
+
+ if (!isHost) {
+ if (!isTripMode) return;
+ const allowedKeys = ['targetLocation', 'targetLabel'];
+ const incomingKeys = Object.keys(settings || {});
+ const hasInvalid = incomingKeys.some(key => !allowedKeys.includes(key));
+ if (hasInvalid) return;
+ }
+
+ const nextSettings = {
+ ...(room.settings || getDefaultRoomSettings()),
+ ...settings,
+ };
+
+ if (typeof nextSettings.trackingRange === 'number' && nextSettings.trackingRange < 5) {
+ nextSettings.trackingRange = 5;
+ }
+
+ room.settings = nextSettings;
+ rooms.set(normalizedRoomId, room);
+
+ if (isDBConnected()) {
+ const roomsCollection = getRoomsCollection();
+ roomsCollection.updateOne(
+ { roomId: normalizedRoomId },
+ { $set: { settings: room.settings } }
+ ).catch(err => console.error('Error updating settings in DB:', err.message));
+ }
+
+ io.to(normalizedRoomId).emit('room:settings', room.settings);
+ });
+
+ socket.on('room:warning', ({ roomId, warning }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ if (!rooms.get(normalizedRoomId)) return;
+ io.to(normalizedRoomId).emit('room:warning', warning);
+ });
+
+ socket.on('chat:message', ({ roomId, message }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ const text = String(message?.text || "").trim().slice(0, 160);
+ if (!normalizedRoomId || !text || !message?.userId) return;
+
+ io.to(normalizedRoomId).emit('chat:message', {
+ ...message,
+ roomId: normalizedRoomId,
+ text,
+ userName: String(message.userName || "User").trim().slice(0, 40) || "User",
+ sentAt: message.sentAt || Date.now(),
+ });
+ });
+
+ // ===== WALKIE-TALKIE HANDLERS =====
+
+ // User starts talking (push-to-talk)
+ socket.on('walkie:start', ({ roomId, userId, userName }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ console.log(`📻 ${userName} started talking in room ${normalizedRoomId}`);
+
+ // Broadcast to all others in the room
+ socket.to(normalizedRoomId).emit('walkie:Speaking', {
+ userId,
+ userName,
+ roomId: normalizedRoomId
+ });
+ });
+
+// User stops talking
+ socket.on('walkie:stop', ({ roomId, userId }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ console.log(`📻 User ${userId} stopped talking in room ${normalizedRoomId}`);
+
+ // Broadcast to all others in the room
+ socket.to(normalizedRoomId).emit('walkie:Stopped', {
+ userId,
+ roomId: normalizedRoomId
+ });
+ });
+
+ socket.on('walkie:offer', ({ toUserId, fromUserId, sdp }) => {
+ const targetSocketId = userSockets.get(toUserId);
+ if (!targetSocketId) return;
+ io.to(targetSocketId).emit('walkie:offer', { fromUserId, sdp });
+ });
+
+ socket.on('walkie:answer', ({ toUserId, fromUserId, sdp }) => {
+ const targetSocketId = userSockets.get(toUserId);
+ if (!targetSocketId) return;
+ io.to(targetSocketId).emit('walkie:answer', { fromUserId, sdp });
+ });
+
+ socket.on('walkie:ice', ({ toUserId, fromUserId, candidate }) => {
+ const targetSocketId = userSockets.get(toUserId);
+ if (!targetSocketId) return;
+ io.to(targetSocketId).emit('walkie:ice', { fromUserId, candidate });
+ });
+
+ // ===== EMERGENCY SOS HANDLERS =====
+
+ socket.on('sos:activate', ({ roomId, userId, userName, location }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ console.log(`🚨 SOS ACTIVATED by ${userName} in room ${normalizedRoomId}`);
+
+ io.to(normalizedRoomId).emit('sos:activated', {
+ userId,
+ userName,
+ roomId: normalizedRoomId,
+ location: location,
+ activatedAt: Date.now()
+ });
+ });
+
+ socket.on('sos:cancel', ({ roomId, userId }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ console.log(`🚨 SOS CANCELLED by user ${userId} in room ${normalizedRoomId}`);
+
+ io.to(normalizedRoomId).emit('sos:cancelled', {
+ userId,
+ roomId: normalizedRoomId
+ });
+ });
+
+ socket.on('sos:countdown', ({ roomId, userId, seconds }) => {
+ const normalizedRoomId = (roomId || "").toUpperCase();
+ socket.to(normalizedRoomId).emit('sos:countdown', {
+ userId,
+ roomId: normalizedRoomId,
+ seconds
+ });
+ });
+
+ socket.on('disconnect', async () => {
+ console.log('User disconnected:', socket.id);
+
+ // Find and remove user
+ for (const [userId, socketId] of userSockets.entries()) {
+ if (socketId === socket.id) {
+ const roomId = userRooms.get(userId);
+
+ if (roomId) {
+ let room = rooms.get(roomId);
+
+ if (room) {
+ // Remove member from cache
+ room.members = room.members.filter(m => m.userId !== userId);
+
+ // Update MongoDB (with safe fallback)
+ if (room.members.length === 0) {
+ await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ await roomsCollection.deleteOne({ roomId });
+ },
+ () => console.log('💾 Deleted room from in-memory storage')
+ );
+ rooms.delete(roomId);
+ } else {
+ await safeMongoOperation(
+ async () => {
+ const roomsCollection = getRoomsCollection();
+ await roomsCollection.updateOne(
+ { roomId },
+ { $set: { members: room.members } }
+ );
+ },
+ () => console.log('💾 Updated room in in-memory storage')
+ );
+ rooms.set(roomId, room);
+ }
+
+ // Notify others
+ io.to(roomId).emit('user:left', { userId });
+ }
+ }
+
+ userSockets.delete(userId);
+ userRooms.delete(userId);
+ break;
+ }
+ }
+ });
+});
+
+const PORT = process.env.PORT || 5000;
+
+// Start server with MongoDB connection
+async function startServer() {
+ try {
+ await connectDB();
+
+ server.listen(PORT, () => {
+ console.log(`🚀 Server running on port ${PORT}`);
+ console.log(`📍 Frontend URL: ${process.env.FRONTEND_URL || 'http://localhost:5173'}`);
+ if (isDBConnected()) {
+ console.log(`💾 Using MongoDB for persistent storage`);
+ } else {
+ console.log(`⚠️ Using in-memory storage (data lost on restart)`);
+ }
+ });
+ } catch (err) {
+ console.error('Failed to start server:', err);
+ process.exit(1);
+ }
+}
+
+startServer();
diff --git a/Backend/vercel.json b/Backend/vercel.json
new file mode 100644
index 00000000..c7d2313e
--- /dev/null
+++ b/Backend/vercel.json
@@ -0,0 +1,9 @@
+{
+ "version": 2,
+ "builds": [
+ {
+ "src": "server.js",
+ "use": "@vercel/node"
+ }
+ ]
+}
diff --git a/DEPLOYMENT_CHECKLIST.md b/DEPLOYMENT_CHECKLIST.md
new file mode 100644
index 00000000..d5b61609
--- /dev/null
+++ b/DEPLOYMENT_CHECKLIST.md
@@ -0,0 +1,96 @@
+# Deployment Checklist
+
+## ✅ Backend (Render)
+
+- [ ] **Add MONGODB_URI to Render Environment Variables**
+ - Go to: https://dashboard.render.com/
+ - Select your backend service
+ - Add: `MONGODB_URI=mongodb://aksingh4539047_db_user:ankit45mongo@ac-2zly6wl-shard-00-00.jz1bzub.mongodb.net:27017/?tls=true&authSource=admin&directConnection=true`
+
+- [ ] **Verify other environment variables on Render:**
+ - `FRONTEND_URL=https://coordinatev2.vercel.app`
+ - `PORT=5000`
+ - `NODE_ENV=production`
+
+- [ ] **Push latest code to Git repository**
+ ```bash
+ cd C:\Users\ACER\Desktop\coordinator\Coordinate\Backend
+ git add .
+ git commit -m "fix: improve MongoDB connection and error handling"
+ git push
+ ```
+
+- [ ] **Check Render logs after deployment**
+ - Should see: ✅ MongoDB Connected Successfully
+ - Should see: 🚀 Server running on port 5000
+
+- [ ] **Whitelist all IPs in MongoDB Atlas** (if not already done)
+ - Network Access → Add IP → Allow from Anywhere (0.0.0.0/0)
+
+## ✅ Frontend (Vercel)
+
+- [ ] **Update Vercel Environment Variables**
+ - Go to: https://vercel.com/dashboard
+ - Select your frontend project
+ - Add environment variable: `VITE_SOCKET_URL=https://coordinate-dfj5.onrender.com`
+
+- [ ] **Redeploy to Vercel**
+ ```bash
+ cd C:\Users\ACER\Desktop\coordinator\Coordinate\Frontend
+ vercel --prod
+ ```
+ OR trigger deployment via Git push
+
+## ✅ Test Everything
+
+- [ ] **Test backend health**
+ ```bash
+ curl https://coordinate-dfj5.onrender.com/
+ ```
+
+- [ ] **Test frontend**
+ - Open: https://coordinatev2.vercel.app
+ - Open browser console (F12)
+ - Should NOT see 521 errors
+ - Should see: ✅ Socket connected
+
+- [ ] **Test room creation**
+ - Create a room
+ - Should get QR code
+ - Should see room ID
+
+- [ ] **Test location sharing**
+ - Join room with mobile device
+ - Location should update in real-time
+
+## 🔧 Troubleshooting
+
+### Still getting 521 error?
+1. Check Render logs for specific error
+2. Verify MONGODB_URI is correctly set
+3. Check MongoDB Atlas network access settings
+4. Try restarting the Render service
+
+### Socket.IO still not connecting?
+1. Verify VITE_SOCKET_URL is set correctly in Vercel
+2. Clear browser cache and reload
+3. Check browser console for CORS errors
+4. Verify CORS settings in server.js match your frontend URL
+
+### MongoDB connection timeout?
+1. Check MongoDB Atlas is running
+2. Verify credentials in MONGODB_URI
+3. Whitelist Render's IP range
+4. Check network/firewall settings
+
+## 📞 Quick Test Commands
+
+```bash
+# Test backend API
+curl -X POST https://coordinate-dfj5.onrender.com/api/rooms/create \
+ -H "Content-Type: application/json" \
+ -d '{"hostId":"test123","hostName":"Test User"}'
+
+# Check server status
+curl -I https://coordinate-dfj5.onrender.com
+```
diff --git a/DEPLOY_QUICK.md b/DEPLOY_QUICK.md
new file mode 100644
index 00000000..91c79570
--- /dev/null
+++ b/DEPLOY_QUICK.md
@@ -0,0 +1,178 @@
+# 🚀 Deploy in 10 Minutes - Step by Step
+
+## Prerequisites
+- GitHub account
+- Vercel account (free) - https://vercel.com
+- Render account (free) - https://render.com
+
+---
+
+## Step 1: Push Code to GitHub
+
+```bash
+# Make sure you're on production branch
+git checkout production
+
+# Add all changes
+git add .
+
+# Commit
+git commit -m "Ready for production"
+
+# Push to GitHub
+git push origin production
+```
+
+---
+
+## Step 2: Deploy Backend to Render (5 minutes)
+
+1. **Go to** https://render.com
+2. **Sign in** with GitHub
+3. **Click** "New +" → "Web Service"
+4. **Connect** your `Coordinate` repository
+5. **Fill in**:
+ ```
+ Name: coordinator-backend
+ Region: Singapore
+ Branch: production
+ Root Directory: Backend
+ Runtime: Node
+ Build Command: npm install
+ Start Command: node server.js
+ ```
+6. **Choose**: Free plan
+7. **Environment Variables**:
+ ```
+ PORT=5000
+ FRONTEND_URL=https://YOUR_APP.vercel.app
+ NODE_ENV=production
+ ```
+ *(Leave FRONTEND_URL empty for now, update after frontend deploy)*
+8. **Click** "Create Web Service"
+9. **Wait** for deployment (green checkmark)
+10. **Copy** your URL: `https://coordinator-backend-xxxx.onrender.com`
+
+---
+
+## Step 3: Deploy Frontend to Vercel (3 minutes)
+
+1. **Go to** https://vercel.com
+2. **Sign in** with GitHub
+3. **Click** "Add New" → "Project"
+4. **Import** your `Coordinate` repository
+5. **Configure**:
+ ```
+ Root Directory: Frontend
+ Framework Preset: Vite
+ Build Command: npm run build
+ Output Directory: dist
+ ```
+6. **Environment Variables**:
+ ```
+ VITE_SOCKET_URL=https://coordinator-backend-xxxx.onrender.com
+ ```
+ *(Use your Render URL from Step 2)*
+7. **Click** "Deploy"
+8. **Wait** for deployment
+9. **Copy** your URL: `https://coordinator.vercel.app`
+
+---
+
+## Step 4: Update Backend URL (2 minutes)
+
+1. **Go back to** Render Dashboard
+2. **Select** your backend service
+3. **Click** "Environment" tab
+4. **Update** `FRONTEND_URL`:
+ ```
+ FRONTEND_URL=https://coordinator.vercel.app
+ ```
+ *(Use your Vercel URL from Step 3)*
+5. **Click** "Save Changes"
+6. **Wait** for redeploy
+
+---
+
+## Step 5: Test Your App (1 minute)
+
+1. **Open** `https://coordinator.vercel.app` in browser
+2. **Click** "Create New Group"
+3. **Enter** your name
+4. **Allow** location permission when prompted
+5. **Check** if map shows your location
+6. **Open** incognito window
+7. **Join** the room with a different name
+8. **Verify** both users appear on map
+
+---
+
+## ✅ Done! Your App is Live!
+
+**Frontend**: `https://coordinator.vercel.app`
+**Backend**: `https://coordinator-backend-xxxx.onrender.com`
+
+---
+
+## 📱 Share Your App
+
+Share the Vercel URL with friends:
+- Send them the link
+- They click "Join Existing Group"
+- Enter the room code
+- They can see your location in real-time!
+
+---
+
+## ⚠️ Important Notes
+
+### Render Free Tier Limitations
+- Backend sleeps after 15 minutes of inactivity
+- First request after sleep takes ~30 seconds to wake up
+- Solution: Upgrade to paid plan ($7/month) or use uptime monitor
+
+### HTTPS Required
+- Geolocation only works on HTTPS
+- Vercel and Render provide HTTPS automatically
+- Local testing: Use `http://localhost` (works without HTTPS)
+
+### CORS Issues
+- If you get CORS errors, check:
+ - Backend `FRONTEND_URL` env variable
+ - Backend server.js CORS configuration
+ - Both URLs match exactly (no trailing slashes)
+
+---
+
+## 🔧 Troubleshooting
+
+### "Cannot connect to server"
+1. Check backend is running (visit Render URL)
+2. Verify `VITE_SOCKET_URL` in Vercel env vars
+3. Check Vercel deployment logs
+
+### "Location not showing"
+1. Allow location permissions in browser
+2. Use HTTPS (already done on Vercel/Render)
+3. Check browser console (F12) for errors
+
+### "Room not found"
+1. Ensure backend is awake (visit Render URL first)
+2. Check room code is correct (uppercase)
+3. Verify backend logs on Render
+
+---
+
+## 📊 Monitor Your App
+
+**Vercel Analytics**: Dashboard → Project → Analytics
+**Render Logs**: Dashboard → Web Service → Logs
+**Vercel Logs**: Dashboard → Project → Deployments → View logs
+
+---
+
+## 🎉 Congratulations!
+
+You've successfully deployed your Coordinator app!
+
+Share it with your friends and start coordinating! 📍
diff --git a/Frontend/README.md b/Frontend/README.md
new file mode 100644
index 00000000..7059a962
--- /dev/null
+++ b/Frontend/README.md
@@ -0,0 +1,12 @@
+# React + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
diff --git a/Frontend/eslint.config.js b/Frontend/eslint.config.js
new file mode 100644
index 00000000..cee1e2c7
--- /dev/null
+++ b/Frontend/eslint.config.js
@@ -0,0 +1,29 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{js,jsx}'],
+ extends: [
+ js.configs.recommended,
+ reactHooks.configs['recommended-latest'],
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ parserOptions: {
+ ecmaVersion: 'latest',
+ ecmaFeatures: { jsx: true },
+ sourceType: 'module',
+ },
+ },
+ rules: {
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
+ },
+ },
+])
diff --git a/Frontend/index.html b/Frontend/index.html
new file mode 100644
index 00000000..71abf7e9
--- /dev/null
+++ b/Frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Coordinator - Find Your Group
+
+
+
+
+
+
diff --git a/Frontend/package-lock.json b/Frontend/package-lock.json
new file mode 100644
index 00000000..fe082427
--- /dev/null
+++ b/Frontend/package-lock.json
@@ -0,0 +1,4267 @@
+{
+ "name": "frontend",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "frontend",
+ "version": "0.0.0",
+ "dependencies": {
+ "@tailwindcss/vite": "^4.1.11",
+ "axios": "^1.11.0",
+ "leaflet": "^1.9.4",
+ "lucide-react": "^0.541.0",
+ "qrcode": "^1.5.4",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
+ "react-leaflet": "^5.0.0",
+ "react-router-dom": "^7.7.1",
+ "socket.io-client": "^4.8.1",
+ "tailwindcss": "^4.1.11",
+ "uuid": "^11.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.30.1",
+ "@types/react": "^19.1.8",
+ "@types/react-dom": "^19.1.6",
+ "@vitejs/plugin-react": "^4.6.0",
+ "eslint": "^9.30.1",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "globals": "^16.3.0",
+ "vite": "^7.0.6"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.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.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
+ "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
+ "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.0",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.27.3",
+ "@babel/helpers": "^7.27.6",
+ "@babel/parser": "^7.28.0",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.0",
+ "@babel/types": "^7.28.0",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz",
+ "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.0",
+ "@babel/types": "^7.28.0",
+ "@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.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
+ "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": 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.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz",
+ "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
+ "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.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.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz",
+ "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.0",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
+ "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "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.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
+ "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
+ "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "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.0",
+ "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/eslintrc/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/@eslint/js": {
+ "version": "9.32.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz",
+ "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==",
+ "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.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
+ "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.15.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "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.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "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/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
+ "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
+ "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.29",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
+ "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@react-leaflet/core": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz",
+ "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==",
+ "license": "Hippocratic-2.1",
+ "peerDependencies": {
+ "leaflet": "^1.9.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz",
+ "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz",
+ "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz",
+ "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz",
+ "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz",
+ "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz",
+ "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz",
+ "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz",
+ "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz",
+ "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz",
+ "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz",
+ "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz",
+ "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz",
+ "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz",
+ "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz",
+ "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz",
+ "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz",
+ "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz",
+ "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz",
+ "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz",
+ "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz",
+ "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz",
+ "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz",
+ "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz",
+ "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz",
+ "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "license": "MIT"
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz",
+ "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "enhanced-resolve": "^5.18.1",
+ "jiti": "^2.4.2",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.17",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.11"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz",
+ "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.4",
+ "tar": "^7.4.3"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.11",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.11",
+ "@tailwindcss/oxide-darwin-x64": "4.1.11",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.11",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.11",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.11",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.11",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.11",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.11"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz",
+ "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz",
+ "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz",
+ "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz",
+ "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz",
+ "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz",
+ "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz",
+ "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz",
+ "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz",
+ "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz",
+ "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@emnapi/wasi-threads": "^1.0.2",
+ "@napi-rs/wasm-runtime": "^0.2.11",
+ "@tybys/wasm-util": "^0.9.0",
+ "tslib": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz",
+ "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz",
+ "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz",
+ "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.1.11",
+ "@tailwindcss/oxide": "4.1.11",
+ "tailwindcss": "4.1.11"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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/react": {
+ "version": "19.1.9",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz",
+ "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz",
+ "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.27",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "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/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/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/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz",
+ "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.16.0",
+ "form-data": "^4.0.5",
+ "https-proxy-agent": "^5.0.1",
+ "proxy-from-env": "^2.1.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/brace-expansion": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.25.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
+ "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001726",
+ "electron-to-chromium": "^1.5.173",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001731",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz",
+ "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "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/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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/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-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.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dijkstrajs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
+ "license": "MIT"
+ },
+ "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==",
+ "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.192",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz",
+ "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/engine.io-client": {
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
+ "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1",
+ "xmlhttprequest-ssl": "~2.1.1"
+ }
+ },
+ "node_modules/engine.io-client/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.2",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
+ "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "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==",
+ "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/esbuild": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz",
+ "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.0",
+ "@eslint/config-helpers": "^0.3.0",
+ "@eslint/core": "^0.15.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.32.0",
+ "@eslint/plugin-kit": "^0.3.4",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "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-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.20",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
+ "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "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/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-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/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "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/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.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "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==",
+ "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-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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": "16.3.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz",
+ "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "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/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-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "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==",
+ "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.3",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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/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-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/jiti": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
+ "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==",
+ "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/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/leaflet": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
+ "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
+ "license": "BSD-2-Clause"
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "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-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "cpu": [
+ "x64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "cpu": [
+ "x64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "cpu": [
+ "x64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "cpu": [
+ "x64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "cpu": [
+ "x64"
+ ],
+ "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/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.541.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.541.0.tgz",
+ "integrity": "sha512-s0Vircsu5WaGv2KoJZ5+SoxiAJ3UXV5KqEM3eIFDHaHkcLIFdIWgXtZ412+Gh02UsdS7Was+jvEpBvPCWQISlg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "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/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/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/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/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/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/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==",
+ "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/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": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+ "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
+ "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
+ "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/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/qrcode": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz",
+ "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "dijkstrajs": "^1.0.1",
+ "pngjs": "^5.0.0",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "qrcode": "bin/qrcode"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.1.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz",
+ "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz",
+ "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.1"
+ }
+ },
+ "node_modules/react-leaflet": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz",
+ "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==",
+ "license": "Hippocratic-2.1",
+ "dependencies": {
+ "@react-leaflet/core": "^3.0.0"
+ },
+ "peerDependencies": {
+ "leaflet": "^1.9.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.15.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.1.tgz",
+ "integrity": "sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.15.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.15.1.tgz",
+ "integrity": "sha512-AzF62gjY6U9rkMq4RfP/r2EVtQ7DMfNMjyOp/flLTCrtRylLiK4wT4pSq6O8rOXZ2eXdZYJPEYe+ifomiv+Igg==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.15.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "license": "ISC"
+ },
+ "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/rollup": {
+ "version": "4.60.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz",
+ "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.60.4",
+ "@rollup/rollup-android-arm64": "4.60.4",
+ "@rollup/rollup-darwin-arm64": "4.60.4",
+ "@rollup/rollup-darwin-x64": "4.60.4",
+ "@rollup/rollup-freebsd-arm64": "4.60.4",
+ "@rollup/rollup-freebsd-x64": "4.60.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.60.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.60.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.60.4",
+ "@rollup/rollup-linux-arm64-musl": "4.60.4",
+ "@rollup/rollup-linux-loong64-gnu": "4.60.4",
+ "@rollup/rollup-linux-loong64-musl": "4.60.4",
+ "@rollup/rollup-linux-ppc64-gnu": "4.60.4",
+ "@rollup/rollup-linux-ppc64-musl": "4.60.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.60.4",
+ "@rollup/rollup-linux-riscv64-musl": "4.60.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.60.4",
+ "@rollup/rollup-linux-x64-gnu": "4.60.4",
+ "@rollup/rollup-linux-x64-musl": "4.60.4",
+ "@rollup/rollup-openbsd-x64": "4.60.4",
+ "@rollup/rollup-openharmony-arm64": "4.60.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.60.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.60.4",
+ "@rollup/rollup-win32-x64-gnu": "4.60.4",
+ "@rollup/rollup-win32-x64-msvc": "4.60.4",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "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-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "license": "ISC"
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "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/socket.io-client": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+ "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.2",
+ "engine.io-client": "~6.6.1",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-client/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz",
+ "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "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/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-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/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/tailwindcss": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz",
+ "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
+ "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.5.15",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz",
+ "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "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/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "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/uuid": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
+ "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/vite": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz",
+ "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "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-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "license": "ISC"
+ },
+ "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/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xmlhttprequest-ssl": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "license": "ISC"
+ },
+ "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/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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"
+ }
+ }
+ }
+}
diff --git a/Frontend/package.json b/Frontend/package.json
new file mode 100644
index 00000000..eb0eb74b
--- /dev/null
+++ b/Frontend/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@tailwindcss/vite": "^4.1.11",
+ "axios": "^1.11.0",
+ "leaflet": "^1.9.4",
+ "lucide-react": "^0.541.0",
+ "qrcode": "^1.5.4",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0",
+ "react-leaflet": "^5.0.0",
+ "react-router-dom": "^7.7.1",
+ "socket.io-client": "^4.8.1",
+ "tailwindcss": "^4.1.11",
+ "uuid": "^11.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.30.1",
+ "@types/react": "^19.1.8",
+ "@types/react-dom": "^19.1.6",
+ "@vitejs/plugin-react": "^4.6.0",
+ "eslint": "^9.30.1",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "globals": "^16.3.0",
+ "vite": "^7.0.6"
+ }
+}
diff --git a/Frontend/public/_redirects b/Frontend/public/_redirects
new file mode 100644
index 00000000..ad37e2c2
--- /dev/null
+++ b/Frontend/public/_redirects
@@ -0,0 +1 @@
+/* /index.html 200
diff --git a/Frontend/public/vite.svg b/Frontend/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/Frontend/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Frontend/public/worldmap.jpg b/Frontend/public/worldmap.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1b7f85ea4904087e2ee17f6850f6679f294b782a
GIT binary patch
literal 5574499
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