From fb70458e096cbb9e2205c451178edb146980aded Mon Sep 17 00:00:00 2001 From: Yumo L Date: Thu, 27 Feb 2025 20:40:49 -0800 Subject: [PATCH 1/6] Improved my cookie clicker --- week4/yumo_liu/cookie_crunch.mp3 | Bin 0 -> 86880 bytes week4/yumo_liu/index.html | 95 +++++++++++++++++++++++++++++++ week4/yumo_liu/mouse_click.mp3 | Bin 0 -> 33024 bytes 3 files changed, 95 insertions(+) create mode 100644 week4/yumo_liu/cookie_crunch.mp3 create mode 100644 week4/yumo_liu/index.html create mode 100644 week4/yumo_liu/mouse_click.mp3 diff --git a/week4/yumo_liu/cookie_crunch.mp3 b/week4/yumo_liu/cookie_crunch.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..89dd712bd1103924ad6158c1bce148d66db84ce4 GIT binary patch literal 86880 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Ø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 ZfCG+?Apf1X{4e-3{BQbQ{vVd({{S@LuQC7t literal 0 HcmV?d00001 diff --git a/week4/yumo_liu/index.html b/week4/yumo_liu/index.html new file mode 100644 index 00000000..491dd8aa --- /dev/null +++ b/week4/yumo_liu/index.html @@ -0,0 +1,95 @@ + + +
+

Factory Name:

+
+ +
+

Challenge Timer

+

Click to start a 30 second timer. See how many cookies you can make!

+ +
+ +
+
+ +
+
+

+ 0 cookies +

+ + + +
+

Upgrades

+

5 MORE COOKIES per click

+

Trade cookies for this upgrade!

+

Can purchase multiple times

+ +
+ +
+

Click on me. I will eat all your cookies.

+ + + + + + + + + diff --git a/week4/yumo_liu/mouse_click.mp3 b/week4/yumo_liu/mouse_click.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..090ebc0a98fa4e8034e67999b407662ee10a60db GIT binary patch literal 33024 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 z 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'{MihAOv1LAiD<4Q}zXx@(TVzdSu; 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 Date: Thu, 6 Mar 2025 20:25:22 -0800 Subject: [PATCH 2/6] Made a live chat box --- week5/yumo_liu/index.html | 57 ++ week5/yumo_liu/index.js | 34 + week5/yumo_liu/package-lock.json | 1086 ++++++++++++++++++++++++++++++ week5/yumo_liu/package.json | 9 + 4 files changed, 1186 insertions(+) create mode 100644 week5/yumo_liu/index.html create mode 100644 week5/yumo_liu/index.js create mode 100644 week5/yumo_liu/package-lock.json create mode 100644 week5/yumo_liu/package.json diff --git a/week5/yumo_liu/index.html b/week5/yumo_liu/index.html new file mode 100644 index 00000000..55551bf2 --- /dev/null +++ b/week5/yumo_liu/index.html @@ -0,0 +1,57 @@ + + + + Socket.IO chat + + + +
    +
    + +
    + + + + + + \ No newline at end of file diff --git a/week5/yumo_liu/index.js b/week5/yumo_liu/index.js new file mode 100644 index 00000000..83edc9ab --- /dev/null +++ b/week5/yumo_liu/index.js @@ -0,0 +1,34 @@ +const express = require('express'); +const app = express(); +const http = require('http'); +const server = http.createServer(app); +const { Server } = require("socket.io"); +const io = new Server(server); + +app.get('/', (req, res) => { + res.sendFile(__dirname + '/index.html'); +}); + +io.on('connection', (socket) => { + console.log('A user connected'); + io.emit('chat message', 'A new user has joined the chat'); + + socket.on('disconnect', () => { + console.log('A user disconnected'); + io.emit('chat message', 'A user has left the chat'); + }); + + socket.on('chat message', (msg) => { + io.emit('chat message', `${socket.nickname}: ${msg}`); //adds the stored nickname before the message + }); + + socket.on("set nickname", (nickname) => { + socket.nickname = nickname; //stores the nickname in server. In this file because in backend. + console.log(`${nickname} joined the chat`); //appears in terminal + }); + + }); + +server.listen(3000, () => { + console.log('listening on *:3000'); +}); \ No newline at end of file diff --git a/week5/yumo_liu/package-lock.json b/week5/yumo_liu/package-lock.json new file mode 100644 index 00000000..cc77ae4b --- /dev/null +++ b/week5/yumo_liu/package-lock.json @@ -0,0 +1,1086 @@ +{ + "name": "socket-chat-example", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "socket-chat-example", + "version": "0.0.1", + "dependencies": { + "express": "^4.21.2", + "socket.io": "^4.8.1" + } + }, + "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.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.13.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", + "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "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/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "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.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "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": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.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/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/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/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/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/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/engine.io/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/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": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.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": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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/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/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.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "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/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "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": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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-adapter/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/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/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/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/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/socket.io/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/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.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/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.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 + } + } + } + } +} diff --git a/week5/yumo_liu/package.json b/week5/yumo_liu/package.json new file mode 100644 index 00000000..e6feb346 --- /dev/null +++ b/week5/yumo_liu/package.json @@ -0,0 +1,9 @@ +{ + "name": "socket-chat-example", + "version": "0.0.1", + "description": "my first socket.io app", + "dependencies": { + "express": "^4.21.2", + "socket.io": "^4.8.1" + } +} From 26cf32250263061f22994ec10a906d46373d8bde Mon Sep 17 00:00:00 2001 From: Yumo L Date: Thu, 13 Mar 2025 20:26:13 -0700 Subject: [PATCH 3/6] Added timestamp feature to Chat box --- week6/yumo_liu/index.html | 63 ++ week6/yumo_liu/index.js | 42 ++ week6/yumo_liu/package-lock.json | 1086 ++++++++++++++++++++++++++++++ week6/yumo_liu/package.json | 9 + 4 files changed, 1200 insertions(+) create mode 100644 week6/yumo_liu/index.html create mode 100644 week6/yumo_liu/index.js create mode 100644 week6/yumo_liu/package-lock.json create mode 100644 week6/yumo_liu/package.json diff --git a/week6/yumo_liu/index.html b/week6/yumo_liu/index.html new file mode 100644 index 00000000..9471cc74 --- /dev/null +++ b/week6/yumo_liu/index.html @@ -0,0 +1,63 @@ + + + + Socket.IO chat + + + +
      +
      + +
      + + + + + + + diff --git a/week6/yumo_liu/index.js b/week6/yumo_liu/index.js new file mode 100644 index 00000000..ecae4f42 --- /dev/null +++ b/week6/yumo_liu/index.js @@ -0,0 +1,42 @@ +const express = require('express'); +const app = express(); +const http = require('http'); +const server = http.createServer(app); +const { Server } = require("socket.io"); +const io = new Server(server); + + +app.get('/', (req, res) => { + res.sendFile(__dirname + '/index.html'); +}); + +io.on('connection', (socket) => { //WHEN connecting + console.log('A user connected'); + io.emit('chat message', { //sending an OBJECT through 'chat message' event + nickname: "System", + message: "A new user has joined the chat", + timestamp: new Date().toISOString() //log a timestamp when user joins + }); + + socket.on('chat message', (msg) => { // WHEN user sends a message + io.emit('chat message', { + nickname: socket.nickname || "Anonymous", // Use nickname if set, otherwise default to "Anonymous" + message: msg, //Actual message text + timestamp: new Date().toISOString() + }); //this event is received in client side as 'chatData' object + }); + + socket.on('disconnect', () => { //WHEN disconnecting + console.log('A user disconnected'); + const userNickname = socket.nickname || "Anonymous" + io.emit('chat message', { //sending an OBJECT through 'chat message' event + nickname: "System", + message: `${userNickname} has left the chat`, //like an f-string + timestamp: new Date().toISOString() //log a timestamp when user leaves + }); + }); +}); + +server.listen(3000, () => { + console.log('listening on *:3000'); +}); \ No newline at end of file diff --git a/week6/yumo_liu/package-lock.json b/week6/yumo_liu/package-lock.json new file mode 100644 index 00000000..cc77ae4b --- /dev/null +++ b/week6/yumo_liu/package-lock.json @@ -0,0 +1,1086 @@ +{ + "name": "socket-chat-example", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "socket-chat-example", + "version": "0.0.1", + "dependencies": { + "express": "^4.21.2", + "socket.io": "^4.8.1" + } + }, + "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.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.13.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", + "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "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/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "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.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "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": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.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/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/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/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/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/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/engine.io/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/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": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.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": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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/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/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.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "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/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "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": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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-adapter/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/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/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/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/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/socket.io/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/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.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/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.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 + } + } + } + } +} diff --git a/week6/yumo_liu/package.json b/week6/yumo_liu/package.json new file mode 100644 index 00000000..e6feb346 --- /dev/null +++ b/week6/yumo_liu/package.json @@ -0,0 +1,9 @@ +{ + "name": "socket-chat-example", + "version": "0.0.1", + "description": "my first socket.io app", + "dependencies": { + "express": "^4.21.2", + "socket.io": "^4.8.1" + } +} From 4863908068ee12b4a38d3b1af8350a38b2e1ae81 Mon Sep 17 00:00:00 2001 From: Yumo L Date: Thu, 13 Mar 2025 20:56:51 -0700 Subject: [PATCH 4/6] Improved chat box Added timestamps: Now a time shows up when a user joins, messages, and leaves the chat --- week6/yumo_liu/index.html | 2 ++ week6/yumo_liu/index.js | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/week6/yumo_liu/index.html b/week6/yumo_liu/index.html index 9471cc74..3c8ff730 100644 --- a/week6/yumo_liu/index.html +++ b/week6/yumo_liu/index.html @@ -52,9 +52,11 @@ window.scrollTo(0, document.body.scrollHeight); }); + /* socket.on('event', (data) => { console.log(`Received event: ${data.data} at ${data.timestamp}`); }); + */ diff --git a/week6/yumo_liu/index.js b/week6/yumo_liu/index.js index ecae4f42..7ac0ae05 100644 --- a/week6/yumo_liu/index.js +++ b/week6/yumo_liu/index.js @@ -12,13 +12,19 @@ app.get('/', (req, res) => { io.on('connection', (socket) => { //WHEN connecting console.log('A user connected'); - io.emit('chat message', { //sending an OBJECT through 'chat message' event + + socket.on("set nickname", (nickname) => { // event when user enters & set nickname + socket.nickname = nickname; // store nickname on the server + console.log(`${nickname} joined the chat`); // appears in terminal + + io.emit('chat message', { //sending an OBJECT through 'chat message' event nickname: "System", - message: "A new user has joined the chat", + message: `${nickname} has joined the chat`, timestamp: new Date().toISOString() //log a timestamp when user joins }); +}); - socket.on('chat message', (msg) => { // WHEN user sends a message + socket.on('chat message', (msg) => { // event WHEN user sends a message io.emit('chat message', { nickname: socket.nickname || "Anonymous", // Use nickname if set, otherwise default to "Anonymous" message: msg, //Actual message text @@ -26,7 +32,7 @@ io.on('connection', (socket) => { //WHEN connecting }); //this event is received in client side as 'chatData' object }); - socket.on('disconnect', () => { //WHEN disconnecting + socket.on('disconnect', () => { // event WHEN disconnecting console.log('A user disconnected'); const userNickname = socket.nickname || "Anonymous" io.emit('chat message', { //sending an OBJECT through 'chat message' event From 2253199a5d5f1a610c914564c76b122f8b3abf82 Mon Sep 17 00:00:00 2001 From: Yumo L Date: Thu, 3 Apr 2025 21:05:26 -0700 Subject: [PATCH 5/6] MongoDB & Message history fetch --- week8/yumo_liu/index.html | 71 ++ week8/yumo_liu/index.js | 80 ++ week8/yumo_liu/package-lock.json | 1322 ++++++++++++++++++++++++++++++ week8/yumo_liu/package.json | 11 + 4 files changed, 1484 insertions(+) create mode 100644 week8/yumo_liu/index.html create mode 100644 week8/yumo_liu/index.js create mode 100644 week8/yumo_liu/package-lock.json create mode 100644 week8/yumo_liu/package.json diff --git a/week8/yumo_liu/index.html b/week8/yumo_liu/index.html new file mode 100644 index 00000000..9a68d775 --- /dev/null +++ b/week8/yumo_liu/index.html @@ -0,0 +1,71 @@ + + + + Socket.IO chat + + + +
        +
        + +
        + + + + + + diff --git a/week8/yumo_liu/index.js b/week8/yumo_liu/index.js new file mode 100644 index 00000000..6be3613a --- /dev/null +++ b/week8/yumo_liu/index.js @@ -0,0 +1,80 @@ +const express = require('express'); +const app = express(); +const http = require('http'); +const server = http.createServer(app); +const { Server } = require("socket.io"); +const io = new Server(server); + +// MongoDB +const mongoose = require('mongoose'); +const messageSchema = new mongoose.Schema({ + nickname: String, + message: String, + timestamp: Date +}); +const messageModel = mongoose.model('Message', messageSchema); + +async function main() { + await mongoose.connect('mongodb+srv://liuyumo:Liu472023089@chatappmessages.cdruj3z.mongodb.net/ChatAppDB?retryWrites=true&w=majority'); + console.log("✅ Mongoose connected to Atlas"); +} +main().catch(err => console.log(err)); + +app.get('/', (req, res) => { + res.sendFile(__dirname + '/index.html'); +}); + +//This is to GET all chat messages from the DB, does not send new ones to DB +app.get('/messages', async function(req, res){ + res.json(await messageModel.find()); +}); + + +//socket.io part +io.on('connection', (socket) => { //WHEN connecting + console.log('A user connected'); + + socket.on("set nickname", (nickname) => { // event when user enters & set nickname + socket.nickname = nickname; // store nickname on the server + console.log(`${nickname} joined the chat`); // appears in terminal + + io.emit('chat message', { //sending an OBJECT through 'chat message' event + nickname: "System", + message: `${nickname} has joined the chat`, + timestamp: new Date().toISOString() //log a timestamp when user joins + }); +}); + + socket.on('chat message', async (msg) => { // event WHEN user sends a message + const chat = { + nickname: socket.nickname || "Anonymous", // Use nickname if set, otherwise default to "Anonymous" + message: msg, //Actual message text + timestamp: new Date() + }; //this event is received in client side as 'chatData' object + + await messageModel.create(chat); // Save to DB + io.emit('chat message', chat); // Send to everyone + }); + +//how to use fetch api method to display old messages when entering localhost:3000??? + + socket.on('disconnect', () => { // event WHEN disconnecting + console.log('A user disconnected'); + const userNickname = socket.nickname || "Anonymous" + + io.emit('chat message', { //sending an OBJECT through 'chat message' event + nickname: "System", + message: `${userNickname} has left the chat`, //like an f-string + timestamp: new Date().toISOString() //log a timestamp when user leaves + }); + }); +}); + +server.listen(3000, () => { + console.log('listening on *:3000'); +}); + +//notes +//to run, type in terminal: node index.js +//go to http://localhost:3000/ for chatroom +//go to http://localhost:3000/messages for messages in DB \ No newline at end of file diff --git a/week8/yumo_liu/package-lock.json b/week8/yumo_liu/package-lock.json new file mode 100644 index 00000000..b8dc76c6 --- /dev/null +++ b/week8/yumo_liu/package-lock.json @@ -0,0 +1,1322 @@ +{ + "name": "socket-chat-example", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "socket-chat-example", + "version": "0.0.1", + "dependencies": { + "express": "^4.21.2", + "mongodb": "^6.15.0", + "mongoose": "^8.13.2", + "socket.io": "^4.8.1" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.1.tgz", + "integrity": "sha512-1NCa8GsZ+OFLTw5KkKQS22wLS+Rs+y02sgkhr99Pm4OSXtSDHCJyq0uscPF0qA86ipGYH4PwtC2+a8Y4RKkCcg==", + "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.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.13.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", + "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.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": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "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/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bson": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "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/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "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.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "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": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.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/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/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/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/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/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/engine.io/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/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": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.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": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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/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/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.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.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/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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/mongodb": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.13.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.2.tgz", + "integrity": "sha512-riCBqZmNkYBWjXpM3qWLDQw7QmTKsVZDPhLXFJqC87+OjocEVpvS3dA2BPPUiLAu+m0/QmEj5pSXKhH+/DgerQ==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.3", + "kareem": "2.6.3", + "mongodb": "~6.15.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/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-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "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/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "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": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "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-adapter/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/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/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/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/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/socket.io/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/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.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.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.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "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/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "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/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 + } + } + } + } +} diff --git a/week8/yumo_liu/package.json b/week8/yumo_liu/package.json new file mode 100644 index 00000000..13d122c6 --- /dev/null +++ b/week8/yumo_liu/package.json @@ -0,0 +1,11 @@ +{ + "name": "socket-chat-example", + "version": "0.0.1", + "description": "my first socket.io app", + "dependencies": { + "express": "^4.21.2", + "mongodb": "^6.15.0", + "mongoose": "^8.13.2", + "socket.io": "^4.8.1" + } +} From 811420910a4e88ae98aef03312a2d09b4c9c0bb9 Mon Sep 17 00:00:00 2001 From: Yumo L Date: Thu, 10 Apr 2025 20:44:14 -0700 Subject: [PATCH 6/6] Shopping List --- week9/yumo_liu/shopping-list-app/.gitignore | 24 + week9/yumo_liu/shopping-list-app/README.md | 12 + .../shopping-list-app/eslint.config.js | 33 + week9/yumo_liu/shopping-list-app/index.html | 13 + .../shopping-list-app/package-lock.json | 2746 +++++++++++++++++ week9/yumo_liu/shopping-list-app/package.json | 27 + .../shopping-list-app/public/vite.svg | 1 + week9/yumo_liu/shopping-list-app/src/App.css | 42 + week9/yumo_liu/shopping-list-app/src/App.jsx | 55 + .../shopping-list-app/src/ShoppingList.jsx | 27 + .../shopping-list-app/src/assets/react.svg | 1 + .../yumo_liu/shopping-list-app/src/index.css | 68 + week9/yumo_liu/shopping-list-app/src/main.jsx | 10 + .../yumo_liu/shopping-list-app/vite.config.js | 7 + 14 files changed, 3066 insertions(+) create mode 100644 week9/yumo_liu/shopping-list-app/.gitignore create mode 100644 week9/yumo_liu/shopping-list-app/README.md create mode 100644 week9/yumo_liu/shopping-list-app/eslint.config.js create mode 100644 week9/yumo_liu/shopping-list-app/index.html create mode 100644 week9/yumo_liu/shopping-list-app/package-lock.json create mode 100644 week9/yumo_liu/shopping-list-app/package.json create mode 100644 week9/yumo_liu/shopping-list-app/public/vite.svg create mode 100644 week9/yumo_liu/shopping-list-app/src/App.css create mode 100644 week9/yumo_liu/shopping-list-app/src/App.jsx create mode 100644 week9/yumo_liu/shopping-list-app/src/ShoppingList.jsx create mode 100644 week9/yumo_liu/shopping-list-app/src/assets/react.svg create mode 100644 week9/yumo_liu/shopping-list-app/src/index.css create mode 100644 week9/yumo_liu/shopping-list-app/src/main.jsx create mode 100644 week9/yumo_liu/shopping-list-app/vite.config.js diff --git a/week9/yumo_liu/shopping-list-app/.gitignore b/week9/yumo_liu/shopping-list-app/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/week9/yumo_liu/shopping-list-app/README.md b/week9/yumo_liu/shopping-list-app/README.md new file mode 100644 index 00000000..fd3b758d --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/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/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-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 and enable type-aware lint rules. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/week9/yumo_liu/shopping-list-app/eslint.config.js b/week9/yumo_liu/shopping-list-app/eslint.config.js new file mode 100644 index 00000000..ec2b712d --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/eslint.config.js @@ -0,0 +1,33 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...reactHooks.configs.recommended.rules, + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/week9/yumo_liu/shopping-list-app/index.html b/week9/yumo_liu/shopping-list-app/index.html new file mode 100644 index 00000000..0c589ecc --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
        + + + diff --git a/week9/yumo_liu/shopping-list-app/package-lock.json b/week9/yumo_liu/shopping-list-app/package-lock.json new file mode 100644 index 00000000..2d1adf4a --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/package-lock.json @@ -0,0 +1,2746 @@ +{ + "name": "shopping-list-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shopping-list-app", + "version": "0.0.0", + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "vite": "^6.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "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.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "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.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "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.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "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/@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.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "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.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", + "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "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.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/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.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.136", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", + "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "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.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@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.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.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.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "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.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "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.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "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/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.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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-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/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.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "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/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/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/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "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/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/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "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/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/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/vite": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "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/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/week9/yumo_liu/shopping-list-app/package.json b/week9/yumo_liu/shopping-list-app/package.json new file mode 100644 index 00000000..fd3027c1 --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/package.json @@ -0,0 +1,27 @@ +{ + "name": "shopping-list-app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "vite": "^6.2.0" + } +} diff --git a/week9/yumo_liu/shopping-list-app/public/vite.svg b/week9/yumo_liu/shopping-list-app/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/week9/yumo_liu/shopping-list-app/src/App.css b/week9/yumo_liu/shopping-list-app/src/App.css new file mode 100644 index 00000000..b9d355df --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/week9/yumo_liu/shopping-list-app/src/App.jsx b/week9/yumo_liu/shopping-list-app/src/App.jsx new file mode 100644 index 00000000..7d75bc88 --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/src/App.jsx @@ -0,0 +1,55 @@ +//Import here (components, libraries) +import { useState } from 'react'; +import './App.css' +import ShoppingList from './ShoppingList'; + +//Component Functions +function App() { + const [shoppingList, setShoppingList] = useState([]); //useState returns array with two values + //declare a state variable named "shoppingList, the function updating it is named "setShoppingList" + //the "[]" argument passed in is the initial state. An empty shopping list. + + const [budget] = useState(100); + + const addItem = (event) => { //addItem is declared using const. It is an event handler function. + event.preventDefault(); //Prevents the default browser action for the event. + let form = event.target; + //"let" declaration declares a re-assignable local variable + let formData = new FormData(form) //"FormData" constructor creates a new FormData object + let formDataObj = Object.fromEntries(formData.entries()) + formDataObj.cost = parseFloat(formDataObj.cost || 0); + + setShoppingList([...shoppingList, formDataObj]) + form.reset(); + } + + const removeItem = (event) => { + const name = event.target.value; + setShoppingList(shoppingList.filter(item => item.name !== name)); //removing the item + }; + + return ( //returning html here! + <> +

        Shopping List Manager

        +
        +
        + + + +
        +
        + +
        + +
        + + + + ); + } + + export default App; \ No newline at end of file diff --git a/week9/yumo_liu/shopping-list-app/src/ShoppingList.jsx b/week9/yumo_liu/shopping-list-app/src/ShoppingList.jsx new file mode 100644 index 00000000..31fe967f --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/src/ShoppingList.jsx @@ -0,0 +1,27 @@ +function ShoppingList({ shoppingList, removeItem, budget }) { //pass in budget as a "prop" + + + const totalSpent = shoppingList.reduce((acc, item) => acc + Number(item.cost), 0); + const remainingBudget = budget - totalSpent; //not App.budget!!! we already are passing in "budget" into "shoppingList" as a prop + + return ( + <> +

        Remaining Budget: ${remainingBudget.toFixed(2)}

        + {shoppingList.map((val, index) => ( +
        + {val.name} + + + +
        + ))} + + ); + } + + + export default ShoppingList; + \ No newline at end of file diff --git a/week9/yumo_liu/shopping-list-app/src/assets/react.svg b/week9/yumo_liu/shopping-list-app/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/week9/yumo_liu/shopping-list-app/src/index.css b/week9/yumo_liu/shopping-list-app/src/index.css new file mode 100644 index 00000000..08a3ac9e --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/week9/yumo_liu/shopping-list-app/src/main.jsx b/week9/yumo_liu/shopping-list-app/src/main.jsx new file mode 100644 index 00000000..b9a1a6de --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/week9/yumo_liu/shopping-list-app/vite.config.js b/week9/yumo_liu/shopping-list-app/vite.config.js new file mode 100644 index 00000000..8b0f57b9 --- /dev/null +++ b/week9/yumo_liu/shopping-list-app/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +})