From 21d4a4273bf9ebb4c3f4fa9e84ead86346ff8a6a Mon Sep 17 00:00:00 2001 From: sembauke Date: Mon, 24 Nov 2025 13:23:06 +0100 Subject: [PATCH 1/5] feat(services): add full-stack-open-notes-app service to docker-compose --- docker-compose.yml | 11 +++++++++++ port-map.json | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 671ff0ba..1195a481 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -248,6 +248,17 @@ services: ports: - 50080:3000 + full-stack-open-notes-app: + container_name: full-stack-open-notes-app + restart: unless-stopped + networks: + - proxy + build: + context: ./apps/full-stack-open-notes-app + dockerfile: ../../shared.Dockerfile + ports: + - 50085:3000 + manage-a-book-trading-club: container_name: manage-a-book-trading-club restart: unless-stopped diff --git a/port-map.json b/port-map.json index 5d6e76da..e37e2dcc 100644 --- a/port-map.json +++ b/port-map.json @@ -17,6 +17,7 @@ "issue-tracker": 50070, "javascript-calculator": 50075, "fruit-search": 50080, + "full-stack-open-notes-app": 50085, "manage-a-book-trading-club": 50200, "markdown-previewer": 50205, "metric-imperial-converter": 50090, @@ -46,4 +47,4 @@ "url-shortener-microservice": 50180, "voting-app": 50185, "weather-proxy": 50190 -} +} \ No newline at end of file From ddc508e05bd5ed0033f88d497e1317ec80820153 Mon Sep 17 00:00:00 2001 From: sembauke Date: Mon, 24 Nov 2025 13:28:03 +0100 Subject: [PATCH 2/5] Add full-stack open notes application with Express server and client-side functionality - Created package.json for project dependencies and scripts - Added static assets including an image (cats.jpg) and JavaScript files (main.js, form-handler.js) - Implemented server.js to handle routes, serve HTML pages, and manage notes - Developed client-side JavaScript to handle note creation and display - Styled application with basic CSS for layout and notes display --- apps/full-stack-open-notes-app/.gitignore | 36 + apps/full-stack-open-notes-app/README.md | 35 + .../package-lock.json | 1209 +++++++++++++++++ apps/full-stack-open-notes-app/package.json | 23 + .../full-stack-open-notes-app/public/cats.jpg | Bin 0 -> 30404 bytes .../public/form-handler.js | 41 + apps/full-stack-open-notes-app/public/main.js | 28 + .../public/styles.css | 8 + apps/full-stack-open-notes-app/server.js | 140 ++ 9 files changed, 1520 insertions(+) create mode 100644 apps/full-stack-open-notes-app/.gitignore create mode 100644 apps/full-stack-open-notes-app/README.md create mode 100644 apps/full-stack-open-notes-app/package-lock.json create mode 100644 apps/full-stack-open-notes-app/package.json create mode 100644 apps/full-stack-open-notes-app/public/cats.jpg create mode 100644 apps/full-stack-open-notes-app/public/form-handler.js create mode 100644 apps/full-stack-open-notes-app/public/main.js create mode 100644 apps/full-stack-open-notes-app/public/styles.css create mode 100644 apps/full-stack-open-notes-app/server.js diff --git a/apps/full-stack-open-notes-app/.gitignore b/apps/full-stack-open-notes-app/.gitignore new file mode 100644 index 00000000..4e7fae9e --- /dev/null +++ b/apps/full-stack-open-notes-app/.gitignore @@ -0,0 +1,36 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Dependency directories +node_modules/ + +# Build and coverage +coverage/ +dist/ +.build/ +.tmp/ +.cache/ + +# Environment variables +.env +.env.* + +# OS files +.DS_Store +Thumbs.db + +# Editor directories and files +.vscode/ +.idea/ +*.swp diff --git a/apps/full-stack-open-notes-app/README.md b/apps/full-stack-open-notes-app/README.md new file mode 100644 index 00000000..f9a9d97d --- /dev/null +++ b/apps/full-stack-open-notes-app/README.md @@ -0,0 +1,35 @@ +# fso-notes-app (Part 0) + +Example application demonstrating traditional web development concepts from Full Stack Open Part 0. + +## Local development + +1. Install dependencies + +```bash +npm install +``` + +2. Start the server + +```bash +npm start +``` + +Or start in watch mode (requires nodemon): + +```bash +npm run dev +``` + +The app serves static files from the `public/` directory. By default it listens on port 3000. + +## Project structure + +- `server.js` — Express server serving static assets and handling routes +- `public/` — Client-side assets (JS, CSS, HTML) +- `package.json` — Scripts and dependencies + +## License + +ISC diff --git a/apps/full-stack-open-notes-app/package-lock.json b/apps/full-stack-open-notes-app/package-lock.json new file mode 100644 index 00000000..e6573314 --- /dev/null +++ b/apps/full-stack-open-notes-app/package-lock.json @@ -0,0 +1,1209 @@ +{ + "name": "fso-notes-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fso-notes-app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.18.2" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-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/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/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/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/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/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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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/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.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/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "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/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "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" + } + } + } +} diff --git a/apps/full-stack-open-notes-app/package.json b/apps/full-stack-open-notes-app/package.json new file mode 100644 index 00000000..4e965bdd --- /dev/null +++ b/apps/full-stack-open-notes-app/package.json @@ -0,0 +1,23 @@ +{ + "name": "fso-notes-app", + "version": "1.0.0", + "description": "Example application demonstrating traditional web development concepts from Full Stack Open Part 0", + "main": "server.js", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js" + }, + "keywords": [ + "express", + "fullstack", + "example" + ], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^4.18.2" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } +} \ No newline at end of file diff --git a/apps/full-stack-open-notes-app/public/cats.jpg b/apps/full-stack-open-notes-app/public/cats.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e6aaec8f493ab3708ca92b98d7eec09e6fff87f GIT binary patch literal 30404 zcmbTdWl$VW@b`(!;skeDT!Jm`?(P~`+!xmbm&M&(7q`VpaCZ+Df(8#B0?F_4f1azm zs(W>JT{ZJ&rl#goJvG%`{q6rY|Jz28LqJ18MMFhFLqkPFM@Pc|-~#}dm;fSNJZyYY zA~G^kA`%h`Y9?9=N=7OY5;{&gMrIZ^b~bWaE*>sc9wt^c*8e#K5gi>JfB|?10K8+R zAfaIW|7`yaA`oC8rXr>yBQhW$5g;NHApSRsK#PEYh>G~X4B`JYL?q;Y_eICR1YrH! z0LMo_LPSPJLP17FMM3$uJM`Z=0tx{tAw91Q+B+R2BU225V7vkPawaI zR|F=2gp`b&f{B@hm5p5hBq$^-A}S}Zps1v*qN=BFU}$7)VhXmkvv+WGa`yJ|_45x1 z42q13j){$nho)y_W@YE(=H-`HR902j)WYi8+B@K#UEMvs!y}_(;}erp)5|NXYwH`E zU$?#=93CB?oc=gFzrDMEczk;P_450FxDXML|2NjZ`G14`Ke!0~aUr3gAfurF4;Lbm z|G$AufPzZTi$*A;gKiCZ$G{hkK_r`2);fgA$glg8*v4xKKmru_&UE`fX#b1s{~cJw z|1Yxt3+(^q+CsoaM*QbIWC8>!gx&T|{lfWhtQypmTjUG9;a2X`sM^$wReWdL71>E6 zm@DsT;_AUN8IZ;kRb>ivP+XSc?RclSsk`qzIL|IdX;PuYKgC8iXwgj@?YtYPJz3Xu zN!_a$fRwQi?N#iQK^2O_YrfFuRyl_6O~bd0tF&A{&5+Xs+f_JU$gHRA$|HB zK`3UEfI7Y22^l6QHhyMGLCO>rm%1Q}J_pzujHY(s%Ds183oPH_(()oHETbVEwMknvXy{=C?l0u-@4PF+cukKV9uPz zv)*xy5H1YR zSIRR_C;zbb=Zm8PUeM7O7jHJNHd?EgyFO@s7gyi)s`w9~QKQ7FJ(=$~9v$JzbVh?4 z<-5T~Qa6b4jAzONK0;7Q4Nwo@C!hoOWhF z860+;1F;v!8?Luf^EBZ(QSf`w*Ymbe@h$BX&9z@4c}F~Z3v?CheoefRpc!^6{+3w$>v%vwGpOyI7(e%wV3hj-ZBB7 zllfO!$Oba9f|G71W_ibq$uiwhP!_Pxl$XNDb88>wG*ZVo7qjSXl{X<>Z| zgFd{_M8)(&GOlyBGoWbDfl1(_gmXIa<&=hlRu%7Trpgrt8cMm+fvgrvZZc$h$zzf z&acaG90w@IfXZkqvX4A921MvhLg#XgdyQrY9-VR^SOs7xp3K`0t z<1h^cUY%g)B1T+Kz@4UiQKn~^=@GZkMbOW5KA2|aV|~qSSHaL#Mh5Cr_>^N-nwUyb z-q4vyE*T9&_eZIYD$qe?uac|hdcNZX{E=?NFUC^Y!BwdH82 ztlE8*mS(c?3<m2R8Ocm(Sfdq358lsbT z9d!KMJhV06^~~7g+C@?c{YmC{D1j_N0xog4-Pa(BDNa(va)UhdW)y>&sOSo2w)m;H zF(bm-59(py2sZ4X);<&D@t@;nB9p^^*!Mez2o$(qh`q3$>p1+$Jvth!SxI~4hWi@R515vNDKI`bNOt0eM1 zfz-x|+cHn(zl)4*n_)I$aYE7l7+TNK#@$e!rEc3T(brXGR=Wh(L8>PPn8l_R)u$gu zWLDQ{X{L+=Bds;4mAczEwia_4`4JbY;T10?Yq7r0lNM&i@IPN8$hCuQ3RvQrPAn?4 z>^#6@AR8_q*LcC-9IDSQf=fv?Ro3Ps5)JL{+S;AR6QByFrz(1;(s=asQop=$J7iD+ z)K;~GSEX5KwyhmCa~y4DsBSCH#e-dT>}vZu%N4u<3R2VJ=alB!Jjn9}Q+3v(L|t0u zf(oj?W{k879Hsx>GS2ej=-$$*@+G;mRB$^QPaVx2@;U$X&iFSVH2*t&ocn&(?qpLD zKejHpb{k$n_Bb9~AM7^oTzuHhW2DrdFBo`z{6W+2Xx;Kl_2`l!bN8lq=3WqFtM^;i z1p8>rl{RjiMj-8&hG8J6s>2YGURzN@!$p%cE0KB2NYsL3G~4kC44VgMDK5RYCvJ9w zok1p%zTGS+?G84hn^ZZCC?BO6CRc-Hi3&I5DmEv!ieG#ioSvTM=K|t#r`TmcNu6aEM!hXXYWA>ZM$LNga*FdB=cLEeYrBS$l=i4u^^J6TQ_6PDe{JpU8IlP|3_I^(SUBT53z*c8T&1{qqYc@3 zq9pH9p+)fr9j8kkOiIden95#~rA4OXfM_?(g@@}^ zHv9sJ1%zn47!@MOAch~D(Bx|zJ_|QlB+b51&O{%-B=7N{vz(bP#4~sI{IvgUM_7)< zrffte<+I^Bofw!IbaZR}Z4{w#f7i3#9ckIp`|ng;awEWuUver)>#%Ru75XFMa zcA7WPuCY3fDqC)6z41AN^U6a&gse0f zbO9)*v$l-X>6c2uEoH65&Z#hBPVx39i6W!D? z%l&CP2VoRjb!M^mmLTNt6EAiSa<^-sUmRnFT^k;erGSu~;_+R3Pg^A9!IYk4NtwP~ zzl-ju;wR)vbC@X)F%6rq-_{RYGHM{0e;&NNtZssbjWD6Q9YvhXc9emD9E~i((AMB>#4N8oq_=sRGF}NCLP2RroE?cQMqe+B!HQe_ z`xu9gj*JveYU3Y6$`$w16H|n|GR7Ootk!}Or@T`ULjzZLOO{PT3#9GjV>iZ`N*o^~ zW+_axNhqa{xtRCc8uBY-<=D7|(Worh9=CUejWDj~1#ng9b}>3m+HtJsQ9;8oy7`zj zi5>+IDT)-IwAC>zns!k;A_w(u^w3VR`B@Vh%4Pu;fJpO5KLo+M;fn+wr5ye zG5kqcYL@Gq^^`n`e}duRZKby-G~XIE{6BHcZG63=*4^S}$!Ve8rFqocMXUJOg`Ld# z-DboeG49Ny#~5BcHjZSx4Y8R-6c#>dd4I$G;hqKhJf=-7?!(kea zP_x`QJJTA4NdFgB%!!|O{IaWuFm8KEN4hQ!(UFYqY`#yTw_IKhU)Ha$MPaFjXO`Q+ zbqYXK6D&c%HTw2)f23M#Px^sz_U=x5D$nP~C7H@?o_fEAIIa$ns%7^_23{(#^Jx!g zZh>5X;*;q!9=XXx<(ovrIB=W4H;1vOnc+(eD_46rIi8LMLDnp=!PZnNhrM|B!lHR5 zg#IhzpKHr`*1W@*!Wf0A_pcOTE{Vt(YkF;{+M2wpgew`|t|(Zj`^xKwCv%m-pE49kG7=2K%r5S6bDGyQzj#l3O)_R@CWh*TV~q zG>}j}qYK3xjbJbG@LwVc!w5CqJ2P_Td?i5Be+ay`?s)5I^m*XfdSGn;K#L4!6CYB_ zoE&iHsfOF}+UTOVQfAB@`EC()-dVTDZFBNfMFqj27=&=j&ihbBa>cYNb8Joi(z>$_ z&zejZK8le~-)-*@JtY?KCy3)#uO$mZ>ZZnFZUDhF#en!T^nND%cST>`uYlYsu~clf zz3EUMQnADJU9(S4X4%MGixxKj65H>sRea0drTBRUYHh9WNHn= zqtaVOg2B7UF<6qF2L_fURunBvZO;=wIv2dkjEJ&se!V$6(;T6A+S%@l{UE7`Ua04h zg&YXUil6*@rE)sMO~`;KB7C8`VfB7~L~86xS%I7Z3 z1g%_Kiuh7ZFoHeAv`lT&6!`IP`FY6bdnpVl>_e_^<*!@?i%U=G*4!AxW*X&R=6_-J zA1)ePl#(pgq3PoN{#i)FSI@6aP?Wzn76g5q9JKTcUl!M!5d>ITGty}ME# z&LtHb*NE>fB3|NcB6`yHVezKM;49?;mMt=+3RTy78$8tLY7RdtE9&zkarfRteaizf z-0-#|O|JYbZG3d>BxB(g413db);C?t^6~jgY5dTPWUoD_gxvG?>5p$pj=L|`RQfO4C|BO;mcaB#m-!N zbM)30*80S^?qs^q-u0QuPp$sg*YPo*&>D)AE46{>e{36;!>>yXGo>VRf@;#H-o~A6 z!&Oi0>&Y!tMUaXHktAcG6JCqwP%3XaR;iMQrs4~?QNv`(`-zVK5K4x7=6p?18-7Xk zbfc!U3fEO%j;}|uq{|SGeMZm3WLdAKEK%;v=DlZt{D*)jTzlQpC7-OTyl|jE!5RK= z5G$r@pZMxdY{0l0*RDIiZ=tA-5Bvb24e@EXlIhg^F)Fa+Ia*>m-`34*nQP00^=IVA zaI>Yc+3xHHAAfubZbi>yL;3C;#bUDy62>z>p;n{E)(mb&g}IssfU;{ISA=-M!bAz< z8(;<)pORW=(5Ka*ejA(O>QK9z@nWR97?bdu_^PwrUC*e?gp8`z!^(6&#AJWH_{pK& zb~^)((DeII%S z3x#SAl&k68v1{U0gGLaJ*VfEjr+iO`0n?~k9^!BRW)4z{%B{?L{CuuM?AaRhiyJ-n z!+{0+u3}6Qy})ioN{p$=F{$}BGuh4@TU9M=MZ6W_(_XIm=Bm+D0S#Zux3PA!^^KX3 zX_l2EL%o%hQ|*V%%H)W>Ka6RI{Yi;Xk+cP}hM7&*YY!%CDoz;`$=%i0IAF$%xQAk!mvm!Il0-GH#_?Aw2_Y<9G@KZJ-I_!t5kOZbm3SBw7XOw&(Mc^VrxHbrpT| zM%mUcsU*Y1dB2weB%0|!qzn~2FBh}=R)30I0K#DQh2|H1Gd5T*Sk+}Im=iR?q zt=LbaFBTgx(=s9+OH})pqaTP8bvZUBrguKwz5(BNWcJHO^an8+@9pBtvjWIPa2{(q z3y6fMJ~E`V&*mY9Czecy=lPR*nY1FBVELrsAyss$9Lum2r}K)31vU;*kR=)c5_yM+ zOMI*4$c*Azq-ray=@+FV6h>p`$EB?S>I{8NAx(DOrMB>ozn|}_RovM@Ri91TK9OImn?4|xVx3a2W7?TlSs+b19hG`Xp|pSxa~O@8@M5fPffjIMk-kHa@+yb5Y1Qimncac zEk+5vL;ZYGy$sQi9Q>=K{}6%+qY`l|Go~7~h<_~4+0~fJ5I|6*NuF;k#BZIl1H8&j zr1}W<4VhadYhd=Qwj}G{E{pdb!axsJzZ3*6Y(~8BN0HCQY<>k0R5@Q(z!IdMcjbtq zen>5|q^+5S7ebeozHe7J?`eN9o|t$8)Mv)b(Gu>J|C&*2MMu9pPAS{LBOa)he05rB zm!-T#CLTO@qPy+YqIYF1Zwfj@>T{!inqN8v2EtM%7~0d>fu1|ABz7DJr@e%%ZT26-Rr0vk=ZD{`hYg!u<4$xrvHMftWxzH?}JVBwbj zi!>CIH{A?@?#e2VA4`N2>AE(j zw@E;F^KKSb!$-z^+I`&e^D9`Gxktax*3a;di}&cW4Q1^Iy1ze3-s%xYU0-(|uk@$X zee%E{m2j$b)* zNXapb-va?VkxBz=R5rx%(p5iw`(n~{ztF$9^mY2cY0qcg?dTO=wXC{(GY++Jb+a+s zjca)4h^jwz$+)8}6}n$pR)X+}F2i$Q^XJyfNjuw+U7=$t3sti9OPPmdUEkg8*Ox8C zlv;dKzkKru`ns`!*u8`NFZbww-rq~|mWoR{9+x-VPb)s@{YL0)zx;GKt7y9yAd{h> zqqmw&BIz(49rs+f2Xgoq*s2-f#{QK6zDeq-xP(%r1B4%(=Vz#xh{x1y5$`2KS*YopSOUv2Ri7<(z1nz>bi=V z+wyN|v{7_UpFa&=2H%=$1XrI2g_PLw05fn4yoiz?i<%ts%8<>@EO}@%ZjcB1o<-Ab)&$=OwNz_~@}_I^xORwcV2J zD>oxxNl;~X2)Vm@s?IFE*kbTL_(m^fzDWirCr-V}fwis_#b|ssnS(As@O&aT!L=+_9uC6c2HTDqswGzY}cu zw-lUWt5?tIHks-t`Dk8h9&xa|?Pb0b3m#viU9ZaG#AQmDLj!Tjrp;NaflsYllJ$vq zM8lk{O$5FlTeK1+$5JaOQwUP5@`}y3s$1J*9LS|XEgaM%?EWq;9dY4{L7RW(FW5W_ zVGkR)7-@0RQQ^rwHeB)jKGn)A-m=ONX5A$-;F_|J`n}46<{0IT%cq3~v%I(^zRR}L z7DG1Q7^Sup>!C0%zhjb+7B|Wlgb7}fg8H4jIr4h5CBg#ox5UedvHRU`%qaZh+}@Wt zmI3UM3;#nP4&eJHd3jxL*qhig-v&&qq#1`TE~+~8RNg7Q&jEg5u^6t=CsYQgMHXkB z@&+Vbb7}J<{Dt?FS&0eTizr@)y0GBjaQo({IbS41$UR_J47^WeOaeoX`-k~sk8J9{ zTE#7`Oe*>bn@|=8ucxvyqNyNfGl~O}pgrmqYDn%rirSFZ&&t1{(bx1nFXC$nD4~x- zpho;e;sT6GbdJT-_3|&BaF@7KA0C+|-Ex<;|^hHy=n#g zm@nqp)>ACPb+Ut#>6o~8%3>+bjHUeis#(CEOny>_#B}NXV7=Ly+-Pi z-wX?_Is1>f@J)K8Oq-sn2o+G;1j&v4KxXMnDFTN1c|N3)I^Vh#=q3*Jo9MEM9g*sl z7KK4A>z{4ITy^)lVHA_7TL=P~s_L^VzH=O;pv*FK9YR6=_433c>T_JxMvx2 zKGcjh@%Qh}%=8SCW>0(e0{o`Mf|a8p0reTC%m=$M1gnXU4O!U-E>i8Ek7UkPSN;5M z`mAZ=8|+ttC=`r$;_Y`rzU0zmw#ayK3(nwg1?9U9)PoTx-<+3<&zCLICa=-G_&CHi z>#13yFQbgiaxjxepk%Z*f(Kr2GxSt$>a$H@|P<=C;YvknjAIdz6Y- zOY^ug-1w)I_{vU>Y+CZ8Vg1eVY<(|^i9|A*^GjBPU~g_qfIF7eLo`&75HFkgrMs4^ zA4Iq_`}fn=De~b1s42odS_i{nP!NqnK2XS$+}kkD-7)R=><*yf2Z4sYoy31x6= zPuS)J?6Gccf4k94oA+EO(pJ@&V6bV$(4ZGem|Y8yG|2SUNMH8nyzYx+Jyt?lvJF2s zT7JNCqYCu9VZ71y4B(c&bn;c3+5B+t(~+$LrnC(&Sm}lxr{Af`I6($T1j!sR4 zr47K!RQnNLGwLo?S(_aD>7-6b<>sV!Q`QXBL-G45s?vn! zD7jcs-!kratWGtHzgBJ^hm?9R1f^vQcIrsV#Y`fcLK9Om4;0DHiXWcHO9YD-m?*by;B-mLmr`8ch85Hp$io=YlwTMrvA?P+N@Zoh$q^vJOTz(XHZ*6tLwJohXeIy+{h?{F^B&66Bk;3}^tHAcH|C9U4)eMJE5g6$#I@sOTyqq~LWhoyLXj@K8H2)#-~bBzxWE^f z6k&Y#Wj$Rj*k=D`GjxHNiTr%2b(`Tn`LI#GgpFNiQUbwrz}NMTc{C$!@&h}TvB%iN zeBbv4yd5Y>1U`{{fF;O|ZF1b(q?ip8FY>X3S&jl;2?bw%)U!Y~YnvWr+e243#7i>x z^8MX9UlEt>|D@vtzf!B(#Z>GHVV^|Oc%Pk_3BsB@c^78(@}J%LxRnrW_W=#hl;a-| zTQB+8aE~^48XDuCYo&tolS2BGM^{wI<=lYWo)Tlc+)P+3`N(+MfdW6?a!`j6)6%|` z1UX{SsE+}2G}C}eN6~||J{P8^s{+rU4MC&O@@NalKPQ@BaYOzv0lr0xG+6S924YSV!@V*Rk=G|Y|xCo8S z^fb#D*;c!_4FfI<-0%dm?raV_f(MKG3ED%AWEF;V*0I&P(vX=Gs?}gYJ%0(bJK^hU zU46l^E%vIR2<9PkGbd_|2tKBKq*?UAkwe%dWcD_VnSxF8L{#3VI|S zTs>Cjq}xG>GBdxl-ceyNmbaF)9vePC;fG^%z9#YT9{aKlIn}uv9UjDbxasNYBXE)h z1q*Q6_2N43cIH4l`D#D0f6zDhi7A|PDT-&b6BY` zG0BQXnyeZrraG*w`=`J*rS0Ug!r{s%Rb9%~Sx4~%=AH&I{-Nx#vFcuq*&FE7w!Bf` zlKke-;;p-vkod*vx{tcbI+nqrsX6bIH*8C>aE0)thhOz7zft$*+3Hrcrm{EZ0L2bH z$&O+qyrd{{hviv4O}EAIu2(aqTPw^lciPy0ihfvg$)h00*gH11Gu{XEuP-Uk{7m4M z+y^h$XE09?%45;?Bw9O-)yJ0`&)&<&kRglVnh9_Jq9|fOG*|ZHA%C3HHG^HP5XPeo z75(7P_$LbU)ZzPq;XBDSbP{h?N)Jw;OOy8w~f}YQ)p`^3|PqRw75HSGUiXulsYkQJ~YyJRt8?clF$( zJz|lae%yON4DyHWeMqkibY%|<(qkr{LBS#Mi>Rs6OaCL@LP%7Y{k@>8r=GM5g_7Qn zka%G-fHsL+!G6O#T!0;5Jh~f-rjlFM%y-huEnW^d=IN?eO1kkib11GJV*#f8A)oj zLzl~ko?bx-Oe)xZz^l-5I1Ob`ro6inBj*$u@tbcLwni3pAeq(<+97LOTGDvVL$`go zZ;bVItyAz+s^4y)wSLcC?!#4@wS|B;Ij8+Ob2p|Vcq*>QYfXNwdwlln`f47RUs5wr z-BbApP~%cQ*&bTHwgrR?E}TKvVn}vBs}PdC;_tkBfGztbIPO%!Ue|=kl}*fV#14}A z2gff@N|-9w{k+BqF-9B6i&`KL^*E5vDuCX0zsY@l(yj)g%GOBoM}hSNLbeYp4`=zp z*$2m;Z9I9<;okRW%jf<-=dkNNsOXAvuY(Oo-D;+b&ABODsj68cF(X>O8^I)^#iF6V ziw0LN6ZxZTF;6-Y#SWoAlfZ`A_j=ie;4a9-^1%Cp;>uR1S2}wdf7;;Xey49IBA^vT zAtQTVCO6y!t$w=5Viz3{`fhhd{&B<6zG0%C_j;2Kk*%+&?@`l>3D0R63t7{le1C89 z+PX?6zW2QsMSrze%6k-w3!nNa?uX|j6;4GW`_^>F&n`tiye1PNIq&K2^^cW2wW_QZ zn~5W<|1?$Z7e5x%R1K{1CD$1UHe_}=#!Nr|H|Uf^IhBcik=j2 zf})XBc%exdcMfbMKt~Pj{j>i2S?AUJ#|$MCAO}oSA|U==gB&G&p)LkNwnSm61+=MG7I$Jz_z)=8k z6LVuZ1%9+?7zqKi8Um&vWC)KpYCbtn;RY)qnnJug!f3fzT@b%05thi}-0G%R4v{S$ zwdPxXLd{@6s>K95D!D>pA`9OqR)C4%c;|_hQ_-n8Ezu)$aLN- zQ!Jc;-S|NA&EkR>ykngN$4Q@PLv*`;K8zG!asB=|!bJQcI+Gymk`+?ADC{kVSsKcIBKCw1%IKQOM>G9T8Ou0TYcf8l&cqnj z_TFkdIxWrCn?_m!5}D#$Jg>v*U~>%kNd+cq;EN(PTllRI9`)=aZpbn!l>Z6Kc@BWb z#sx%q6y9=y<%`VZC`syAf>CUGtSHPbeg~sv;Cv)9T~x_2?P`^4Ap{jhRnvM0R*1&m~}C4W5(FsGbu5m6N*BG)geZ+8wm} zX0IInB};yWb+}VMHE?3UX>we++`&)&b?iR>B*fa&^#OK$Pl-;ME-ySE>Qq%rV|`0& z@cOZ33HE2zb{}_bycjOAbK+F2C}J-HvJwI9VpKMGYwTvbeIu(+o0@YNnJ{hdLuP=L zF*~9I4LeI}B`W2tM;scx&*%r48^&J-=j1DVOdTLqzoKWt#T>qYzM1svnpW_;8;xU1 zaE#OI0^mVHF&^o`)>MPwP7QDUXt+RBlWzsDXI+~u7=2}{>K*`LHIl}|X0LRtCopoG zc@xuwm`Kv~zXF+vbF;}VOvc5x7z&PehHgPW`v#oW?1hk>0>{*#Ks&-oNuY?$LK|x%mb9WHO7jT1DD>HxXY)z&(IV&uT__OP{{MP z1iWyLploo|xNuPr7ZfI!!z=m>u@_Y$yXaaj%#%yl7Hj-mhG&?+i6^}#t5l_i`?Q(1 zD4?IvQGrP8u@VLKg~`Q!3oTb@>+Tm-j*ASEH_Q+|xg_0ALoYY~LoiDwJu_7JX{+0M zoG$)ZSp#ZMuP_C&dC`v`t%W=f@#92J>n>Kk-@3}Kq41&|9VMDl@wvm8 z-JyEJ4RU{#oMT$HM=3eAU|(J)lIIa8+KiU+L{8mSOc@r1+O9MFq%XZ*jzSfVzm%k zT({;Pr75E$@(ag61cNdQ0DQ=H{>;R1NY6Wr~!jg2c4><$h z>PFidrrLvvHT_xl4b)nFmf2w`p8MHk#Gtwzd0P|@KXc;OQm7Gig5lVte$tBPUxt7& z%YX_8ecx}zYW}pUvo33$u_1$;(8{RCy41a);7&s&m3O6hiGO`Yowc}`*^b{Lqu52H zvPANUIiBK$?SA0s46N>vF$4&eT75P?B_@W??9kg0^d}8Xj?3I!I#MTSyiNiJD~?^m z@Jy#}n~V3*H&ljGT4z$VUYX%W$_{oOAaI_{a7h6%3hQ7c2 z)Q_2!-Q74@vn+(i$%S*LB{k1&aHgoT(T!q2J-=+9GWK*ykzw}k(rSG~Y`y#0Z~e>} zPt(CWb`3_c$jNyr)%DMU+S@>EhTW7jvr^EEnpj7SKrX)zc14wbU%zNjo0SD6tRRc* zDAYMkGG@M>dgJRND18S{`weiv0PT&^ITL(J9dG$^TPtzV17H2{r8O;EElxJ1CUE?w zDj+B2k!fJv)_7h=QajW|6>^f!tlK8y<%qssVSfb3BK7sB>S9tP7WCp{M@cz(s&5Ia zU``#4!jGaT#x?l}C(R{q!7*>|VwP4p$e;jOYo*#6p2p4;WGT#ZuzA*^`p^)?=idY+ zi|T9HRP=035tTC;%(`qGH%X0V*c^iiNw-9%npP}7lZZM&l1AN-`sdH}#0#cGSeV;N z;XS_8i+L}w{Z#L*QW0X>f?|FPW~O-HVYr6T4*zm~Q$zQSx}^#cYW!NflxkKFQax;F zjL+oB)*;{8W+bE^>e)Mv7G&tz1H5x)E;yMKh!{WEMZ1}EGBLa~Ep8(y^K(*^m5?&}uic}qHCVtGj^-6aDjp0)_nNYzpU5@B?dG7xdSI@% zG972YPK1^8_e?h$^hWq^3Oq3%<6_&XEF2mlrhip8YHX7gMZNh;B+!clZm{p>#7?XD z;A!kjt2!WH8CoG=?3DX}Tmy>tulu(B4aK;q5gGe)II$ zrBBa4YgW12Qpo?(8As3z_UR+i?AMp9Ug-Aclq=ZiAKvq%czkn&$s>RgfE_pc; zS>T#J_DYQ^IS&6_Omu;tQllU$pYjf0)KS~dnr#p#>APJ^F>_f4l(!m@sXEi7wUxlm z1M;-gBUDSg0f8pwIr6F^6;28fJn6uLo)Su|lwS(Ivita4w&b+eh3l2?26hN%C@0(L z5z>XILfLELj`B~3OmA(0Oocu6x>8XO_5TEbuJh&NOj$+PxeMehBER)1irPNNwsqKg z(ZU#-Y^3XMN3#E(-Iz@1CGMnR1O~ZsL`d|&;4vC*&T&ZHxWu2pltc$-fWR`*hk!s6F0h30l_zBDX%;$2z zss-~6v%@P0+(N#*WM|~A_OE^SlR5ONijt%7ktq}-_cTq7s*(J$a$Ca}1WT(RN?qbGV` z%^aNqDyqByUc1gG&0Y?@e)i1mk=|yq?5tCLZ6*bU`UoLw%)3`(;!4o^u*IGm&5UDY zqC|+!6wAz1{6GyV!HJH;IqX! zX)=%V)vAj?T>%ta7;foZzDMaKgL795-`#deBa?^JHN^hP?_rmzb|bg)3K)&<%oe6@ z9S?Q>S>hw9TbJHnqNjff<|^-}^tktzHl)Bq z`}8^L&6EW(j+D-4mA=ue*^jdX`>S=Q^92!~LaKLAyLRrz8yTwCP<*TNa3mwQq{MKL zLeV^>C|vJHyKEfLh;^2f=}M{;oP0jm;vh#;%ZS@Ipv7-#NeZy<0*W&?nL+DlaQ_rQ z(iBL4Hg%IHnN|>Z9EWiFvk{Ax0TZa+x5&N!ZSM(W`m{#))tzfFS`D3Cc&N%IdKsP} z4kI4uXpzNT_tS>r9cpZx^tSgTC2~QW(QX8p2Wd@bwFtN^DI3JycKkt=(_MyKZdl(b z(LYR_J1VQIX}GrDUzM5{SEM?xz2$V-{cDTB=OdT|d|7XYqnlwFGbRgXvT*9(DfQHw zhVC{#w*5)!RFzsM5sUpUx5#PI(L*53=+(@6QPPW9y)(hS@Y%qk(jjtH?=&vZcJ}Ob zzBxH-&O(kii@@CiEIh)+FrZn)92ElHd154!Toce8%0>knQeBU$G$~?PD9!T8c>(F( zN^had(7%BZV}b5&UqyS&VgK~MrqRjC0oMJof2=gUM#~ny>!cgL0GLC;%ffdQvMI6j#%%{ z-I>zkD#q@N87oNr8xx;7pz4ks5DE*5IIN7ytxfn$L+@zvsJy%L*|JskJXVw|UIvy&w zQ{w5hE}<{h)e1TE3*Y5T>&ITp2a~_T#`+zRhYyTs0}iFCq*r8Oav1L|jAj;aZ3j>0$c!5v!Jd|x_^!{ejN1RN#B9?#1qgWSg=z?z)l0WTYghhMnOAV< zEGSRf0v5%hGz(X5=!_+I#h@q303(!lydn!afZs z91_ite+s_xW!6cgD0^gb$LU!2CGIZTM^*<)-^tm+)g^o2On)M$J z_&Za$RdFwF(ioO9k#YVttigIa30qU4U@Eh9yu86UQMjX9%o_KCcQf9 zX8a|z?pv2Fa z_LGXL(h}6`l0%$TWN(|AU|U8xr{|tUL6W#Vs(3RifTKRtSS~a>D|83zQoholuK@K2 zwM`^&oDk0&j;ia5ia;08)eK{VnE(g(i_(=?fIWNCEMVbibbQO4yD3^?Ym+gqaygT*i@fc0|9M~+ls)Ew2dwo}rcw&8jj zO$hW22U7b@tZOEB4gjfjh~*aSG}b8~A3q&OrE%J2(^|-&^0nAn-mJ;kV0F(m#Zo-1 z-VWwHrPbOWEf>msa{WbU-d#qv@D?b{+!--}$F)xJ#dH3zIbNzxGf`?##WYX|(YC2M z0A{h}>THMUS3&a{I-|M3B=xOk(xoV+WkvaN!*z3O8M1K86RJQ{kz=jD~0U={u^Z+dUpqmnleNKilC$*P)lw~;A|Te1~$ zLWIvg-jvB>qq&mXY!UX&yn(zol$lUFp%rv&jsb z%H!l*kIJ)|q__)n2r9TL$iuhNm4s5Vyqe-^r2})R$_YI^1!`Q&BipChfb((lAo+*o zStL($aL8wov2erAki^`AY^IIJ~t2Q%le)HLFc$0QXX3CH~D%w^dHrUaB zF@+T(jzCETl!66fc*++Z64oS?#(&Wyzykz)rn}z`cwWh%4)3}(V}%?8QhY?yY^{DB zc$3J90TvTujN{}rq$x?X$el#4kCgy8sNC)5tl$HOsH8Dq;1gYkIZe*vOevas6%9$8 zo&^I#;{|#SYimZ)Ce#=?8)MH>I@WcRO*Da3a!q<~h3#aD)BuMA)3sq%e5SCC%f24b zt!xwiTX}?IA#f{m?DEFI?L)^OF(m#5vhMG0?cpI#GvAU$SF_YzSjlsBGx{mW6~^42 zr$Vwcr7^6kWQ4@v=XT-=t1?_bXY)+*4dWp}{{R}S_Y+MBYe`IudL)~3`i_-5lO>z| zugOWGeVRxlGvE=Eiy!Bl%*kLFNFgZR5c>J4Z^&w4Dr!f;DWOUl;&ZzWE`x zB*&Q>gyXeMtQKWy6)ubUanBoc&N8*;`sJ~X>P2JFp4I74LSs`a1xU|j9M?1Adq8Db zPz{gJwRKQ-+~=vO=aQx*$7-^G`Cw+OY8LGjnA`Y@g-6TCHPT~aKJ9ze6;fM@(!3lV zIjqpcJpfJ-+Y8e^wPHJV7|ufvN{tzu3=TzKwPkV2;EwCZ=~N*YyT^$LU^)}jRY44; z@tlLwtXzfP`???wjmS8rGDU@>7;%GFtj^TH`^Wfu8jmH%2k@xZDA_$l76w|p$C4Qc z!8pfp^{TItBC$WaBRo{jOv-rWyVdJGF{Th?gk!@B1Zn7ZHj8WsQV)EJHL{XL=EKV` z%nzZhi)|t_U63a52Q1^C@T{F?*rG7b2pGVrV422TU5QzmL5VX-Z>dQc+Ks@fI)bz} z2fb(cE zVmWr_nwdpC!AYagEH5LI3~+ekoMN=&Fnyc?-#1)tuROEV1V937sM6(zc2){oBc6I! z9auH7(HY#)lImjrsTVgkapU<)~&RW1uD-Y%6U}>7#{wV?kg4& z);E-b$_P@#f_8)NPP?%YS#JA4V(0HD=~eCKoW$nPs{-FJVmbEd%|ml>4270M7}?2C zcH)kru)vYXjTu5)7!wY^T8`iC)|366C21|B;fEOn_vf`iJ^WU&kDp;Yt{5IF2f3fi zS%ivt>*bCsIacA37jrW^~Ub zae?)w%>Mv6HrP>&XceO_ag%{u zm9;u4kKQgv$ta2O+;pgItmcgV`s;r=$Wd4Bt%Ojl(kg(!e4z7>dWi%l4Iy-opxgax zncrh;p$eGcxY46qc!M+pxa6MonA(NNlXIBcam!@j z=B-?7ki-@;>e4q*4r-v%CP}?cBT}$w?ZXAb0bJP)8x=i8dNu43WXlT`N9v8*ur9Qv zm7SLan&^zW81kHr&}kO{R&21c@t3enLDHLeOKF|p?k913b4;4m7!r@OfADe@Y z^e{D+=nnlWUq#oviB(mI$>$Zw$u1Y(mrjuVqNYmdY1sAU)x?rVu`po}ky3+f63?=L6K%-G;Q*nEl`@+-9(qE9_{h9lf(!so5+q5k7;8)HcZ?D710M zT$<(W{8whmsMs82?yZX*V@uR0j@sH)dE4%V$gEv9jXADp+QIwMFbs+^OB{^*R&D*@ z-z)%#+jd!q<*Q!jO_4B%a=GLXY6&#m;0utFC^+1wl{F7ild)RUQS#6U6`4n%#wtSM z_9l^(;EV=P4iCO+>RB*eR7oB_P!G&12<;}xK^cut@g4;xicJ~vTIEBQjhRm{=ODQfNS=fY3bt*^$^**rbL+vUM$%iwA(};&HRK#}C_~)RV;`5cD94h+vf!z% zVdYr$AdxE_z>Eg<9+jyao@T~X%yMLBoK zAzNt+yPiP7&IJ)#p-Sm9$PNnCa=hk@ns^!OUXjQMDo_B$ENUuUicJ;-bY2{cG>UR7 z(=39-g$PZ+012-o(=UybigA%%f#LmPEBx;}WM7nLp{_cq+~|W=HtwXEpp{xRV51>V ze@ZQ#4VsCgSo6y+bAwh>ae;_k!#S+mrFXSHVJp44Z%%6)T+tVr;y7Rch4R#8Ks`yS zP-WevMk?o=9zm)uzGcWP<&k=1_N_=|1%Z+Sv~(&!G+N+VS&-SwEgwmI;|8eRY3~4H zo>POa(8$C;mV|l| zO?H;{ptb`7j5?{TtxClbViaH>VO=qm&UUP0+uNPtZQCSw71d}ubnXY3>cIA4SlUIf zYsEq^q~kcRThVlgpj2R>t@!p!zv6=(} zCz|4IhU>&xBRmn34K&7%gT;E9#iK`Tq!9hbrFnh)OhXhIUux<+S#TcYqLZ}-E0i)k za&C6zLy*T6ofaR|zlodm5<9Rfu3g6bO+Q5UKS!sT6>E3PLdqUqeU+ zXek!afE6j51B#|t1praIB9O~wW45CXNzF$5DxX?z@&^f9`r%aY$Q6_WQG zQ;r+frm=WrVdlGJ`q0AWp}S{L6t+ET(xiqJW5_-0M@q0s;tHTPd)B4Bio+p}Ve+1o z)I#M8OJL|e@}E;)f#7{AEj$a$nEwEJ#|m4p^{np-=`Snpb>cQXd-_*af@r{5qGKC3 z86R@F>s0$F+MGI?mp7|C>Ngf{z?yxzSY%>bIT>I&lTgKvJyp?nj*J(R_|!LFGqLj| zC3>okwaRJ@5PO30O(OT(*i$cc8DNL^(V2Ff5{EdXhfo&m>cH(`jzQr4Yc|=gQs!9@ zhlHG*jtv$ALf=rf)TD(HL|KUYvacepE}bvh+%^LGfyd=l7AQW_vqv0pZsC~!07|xS z3p97RRppd(#Q}1QyW349K%If{f%+P3(8Dx^n=#DzBg`4;=~Bye_O|`j)j)n{ARY(O zmk~>AF=bhPZPBx2ZT6x_ad#uMzqquy5X!AIZ}(YL{J&FKUO)3D@V>DmZIl+0XL#xI zo`cr3?4DJDIMLXK@@>CpV9h;D*g9t@Zwp1931DaCpDYtlH0 zl9$X1+|!{P5ZqN;lePFX0eH8`xp}J^KBFzY(va9(@+%Q1Y~wX**yZz5)`g~fR*9+o zrWlkqGuZSr_C8-D6S@TGNOD+?qCz=$;afL&GJ%7fKYC$U9+(KSC6gWR91E{E>S(b8=%n4qg3}&qf zuF=*QBOy;eE-{LstUFuIzIl};Ve;+gKT}TPDQZ{OFi2Hh*+|IXRYlY%Y;K8gI&sZu zKc6}%m1EU`VA=I*FLqkkw++lt{^~UWd*Y{icQ|f)5qZXtr$5 zxMeEdrn(`agwX95MiJ^LTLwJjiu8Lp(GYDI0<(1cIN>3RkH)oCmu?3Yz0P(~)@;)1 z7g7NyrFqrvg>fC*6j8JuE7PSQ_o^2WZ^+NV#KC%gbP9 zng%4IH|S1%DVr4lAk#=AttJal(I-iv>l0c8+Cc#HK9%UR&kg;QQ(NH3*c^5yyne|g zdDSBXvm5{`**q`d`;9umCb`VA$@3kDh{wOZXF2ktNWsaSu8A~u)+-b!hH#;G?$6e( zNpUR95!xY-yj!8Je&fqRk+KNM$a0rn=kYsJ!){&gKK_X;!By_2nBa%?XkT4?zP(eaTrIe$n!;$^plu#vx zDe~}0Wj$Ca$KhKLU)!{XDWEFg<9dz{y;amERacP_rC!T}Ln#qQ6cR+vrB@shNCu*{ z+Lu3Oon>T{jjRa$D>C*w=~)saDG}!Y{*_c2BDny^G0EW-x>T)4vE8nOh_3KEV2+2i zao-R@w(zE}8BB(?kY}zwQ&!^E=CDwqZdy4GIeo!vJI5D~FN3vr+mP1M52jSsieCo}-)&RABJvg86Q zE-o9I*Rx=$&q_=Y*m!dD%Xq*f4)xsI+#ra$xB#EZyst)+{Uru?&MVR(7WVPR9S591 z!IP&o#a&qJrLmyTCJd6QV>~k)Rba*C^H7N+^=2SbqPB`#joxo3??y@E=|s$|-@A;I z9SWXn2%0?tdA>ouHhyw8us_nPCG+nh7#w49a_vB@j50Dh53NOcb`%6e3=Tlc zbR)G|WHGT!Vp9~OYP)BF+ZmmVi|MYcU5+{Hwa8N(;@?c>&PaL zP`Lz<%J&{xBmV93#B{Eg!pr5{By4lZ#%m`s!lGZDgMsrE&*xS&$;@-3oROYzILWP{ zxs;zn)L{T9=xJml*i}18L&Ufwf+|@?5aPN{VI*O#&dQ}`^5}!3Ffcr8f1pyKF&7-$u*i#WNbXvrL5O+!ciOL^gU_2pfWBA zRw}~;aa0+zCI=?3UZFBJ0SD5r_;W^@_VzSb$!0xq&{YVbJ-LF#9r6pFm0B40KYUit zisOnq^KT0l5e=v7S=Pg2u6j~qEJq#}2&z5Y^HH_4w@D%%*{kJXkq62_?~1C?ChRG1 z#+`trC8VH@%aQ6jQ=_-XYQBic%AP$cXrS}k;>>H2fK*rN*SPTq*Kn8;(2I zs7-n;VT@ZjXq9rseLX81!@eH8v(nP%3OGBIw^8X=*4-sfFdra;j!#GHe*|eK*N06+jxgMMfpDfLWW4ArItYhb_q)EOo4tI6pufcjr!P_7m4^P&Z zBJ7t93|o=n1#`<_(_oT2t55WnQ#&7+AmbHQSz>l9uzcR3F z^f5wKG7}ic2>3P0_~GJj4r=BJ9b4?|3}>b>TX&LNtN~d_x#*0)ckvzT3&i&K@_0{H zd+T7qZDb-v;~y#ORT%1tl(al)mx?1&PBB;Eu$D$2DckE?x^{@lRhf5gI2G3_mN1NN zb3fUW%-@pl%dN~y8f>CFq$iP{YuEIfh~%(P<~zydgZMbCUnAlsMljGQAh)AR{2-V>J3K}Oo|MuS-azbR8~ht5XRfU z9V9v0KDB<*M)C=hFCIAOIQ)CpBTX}PE@Vd#c;;D}RVkD5?B<_3+A?MGr2hb(YdZSx z${~zy>{$G`2XDPaXKO9ohE-#>PI6Y6FLLxzJZ`LxvPKSg9Vz@Vk+Hw-Z% zm5UL8Xj%#Cb~**;p8}4I2TI(}9M>P=`GhkCW7mw=SgpBw*HU^M%~;|7AjQ5lbvsDs zIj$btQI_5Ev!gelQ~hhyd{w54>n98Mz~a1jR?+TlU6rF^Nx%SSG}fX!Eh}2Mc{a+f zbKhqJ^{d*-L#ydh!pAHIMh76*nOW&~*6t?QAU%t?TI{?Y^Bdt6_2N3P$Cr|STv4%0 zQI5QaV523DuN6<9O1;wmjNJlJrtS^WN@#yaxbY|ewQoe)b zJZDid8JWo^Es}j}M$$W5ffnWox2W~1*HJL*k}5dZ$M+5^MX?=A*Y5(jTTpO1nx-6< z&w7lrGaT}2<&K|qcOY0IW+%{6Z^UE=m4hHNkO=}F2Cc?_ZAD1UTojr-%i%-6|Ht3G>EO@}nRVydx0?~-vaV`baPL0!Z0rOI0O6Hs}rWKNK zM{&VFg>(KpmhgCASyq*VCe}fZQMA?Q78ivsCS=r?kF@6Eu4!Bhb~DhE!Ibsid@bOi*PQ$x7?lf!r^s$Ir+Ps(`1M6J8aPL8pn(y>ymK{A1yX_-@E1sihwXt<0SZ;;PMB({i zxE-zB4{CMTxRxLEf8E6A<|C4|A+>bOts?+OQN>lcp5d_?NK@43uh-JKrKz+CmFDS(Fx%EUJF!&owg@x3euFK__k4IjL-Cx_f{ELX5xP7$8)nQzy04 z#oP`qE>UieK%Ks|lWn9!40h|N25IAV3x?wv&2CR_GGsv*l<|-%g~FKPCCf@sk_qZ7 zNkloHP?~Kr-Zl}Ew?BIU`kJc+@R@?jtGI)Z2LyUm7t@yWGO?N|@#+fHk!iBp{{Y9t zp~H?ayyA-zi?@(Q3dp!2xH;`f2zbu`Z5(@4Rz)MaF-;-aDaHuLHK0;kQt?G7ea9p) z#TpL9cTLfj+&5>Y+JHtxgy%V+$lLZzSTFa0#y_P>fT=2SN2$diu{DucE*C5^PfF~q z+k9YyTqsOGnt43|uAf1;GQ?Ep<*nhdg+y!>-S>raz9rL|cw5RrztnZEk354!fmm`Y zLJteP(ci+Gke z&;=avNljd*9><*O8hpz%iG~DlR}}3t!&g_iX2eJi2JWZuuCD&pYrRG0KqHMv$pF_u zYCuGaS5}k^fHBk7w3S^nAwultG>-^bEbI1(gpLm@oC@la(kpnFTcD3<<6x#rBAGLV z1RuQJzZxRCf;o0YD#$U=u{`@%Jf_*SVv%m%`Z)Hr<+qx7+|_v{vzt+ZTYEVW zb<3P&)ac71Gi9R$V6UZ8yM^u=6pmF?kD)8K6q5#-*+F#@!6am}yAA-Ze&R^dPbzc@ z$B++NqG!}?V^1b{SeT9uw+v<(!4IY!&fL+8YBk1&jZ!n%x~ z#s<}sknyWQBKezsP@}KoT+fRlnS3p)GZT-qNt~bdO(dT(DeTS`E5U)2 zfO=HYNcRe`#tARRN2OxgAZJxpET7#XyG=62DB?*rovYtCWi{zHp}`bZwzL*@MkhuK zgU_vU5*?E^(srY8YrVXgS|S55Jvpup`LQM1_S_9hRx0;4EiV>mls*X+XvGYe2OQTi zWj~hPahlnVY=A-MwNfSSUWURj`TiW%(y^E%P{?ESVcM~xxl))XmK7uum4B4rikZUb zYHb~AquWRO$(rFvA9Q@f@T19&b_GD$_2==dRlDwe)5v98h{p#%d+UmpH(Qkq*%GHD6UX6BRJE9wWJY1= zf5Nj~Mclt_BQyx)0K{h=m7l4{G?q64*@u`;0X?cwd2W{Iw#Y=MuHn*%qY&E3l5)p$ zWapZ`V6k31d=)O>VL&6XsaDn@0Se#013BH>+L;1PaIVt;B2&Q3jN@U?6w}ZR z-wwe95rGmaeJgrn70L)?0M`|!-+4tca!BU3;k#FzT~8yZscfWD)U?qB=G7R8j#-at zV#=cd`Eu7YCT*W2uEF;Jqq2~g$mULxZ;x&(`!r*>%MqS3^VrPy^ znAI3FMn-oafPqVG-V$qL5^CP~B;ha^!k@%`1qc z3Ret1ZnY)NwavO>RmvXV)1YZod9pSJKIk1yNG}>hAkF~(=IRr$UD&G_WPV&*u<89bkJPMY{MXa%z@fc0VbsJFNiZ&fUdpPfMDeQKHl<({Y|0ynpE#NcId znx%bU@mv|uuyM}ZbNW?>n%RoH%Yui3q|?lhO_`E+WzGt>1XC4=Area_A$e81uFjuA zY4TfKoV;;w?8TcWH1>B^62=&+pW*FIT}pPi45=tg@}vL_M^eh(Ozf;D-5ZXW;8qun zbike))Mk?HNfz!x9{hB!kk2fWv;Cb4XZV~}Ka6AhM}@U%9w^&otcN2fZ^~-ndy_4h z<+c&IV9KWhoPk~5nJ(L9hTswy4Xk<}YUjK<(J*-A4uOA(PX@ZBNQ^#OKI9|##w)$* za$d$>u?bLGE?2npt`_ycnqmFy8t$(A#Y4&Ct}BJs7Z)V)ljtgZgg_Gsy-r0>1<3=F zc&x)C4usIMny@w^zCLDs^I8#JZe{hZVPzoZv@Pb~8U%FdI3;=JwXH7-0lAxJdgPMh zcF-$M8-f&r(;aC_3PBk(b`i9DQIoykXa7|&9F3gVO;S<@L^7MUXROpq#}JncN@s=7QOi%P_|%t);hZyF})rG21h zkT|TZL^7g?+hFzSnbtRC2#sr*&vvD9O0tdT>D$B$Lpqx44nJM;g7u_r`J1{VJ)uc#Nyg*6&v% z%SEzJm>x1lDmkoPX~*v{2L%*oG+o?G-tg?m(T^#KTHeXX70+lS!!bi1-YcV42a#Le z=)tQB7v8YER;20jagmN|do@E?fZSM2iZV)?1dll~xKPo#9+>C!t2$-OiFBq(_D9?m z=BfE|D|u|?2t8DDRv{uy(cG&NJCTCljb|p!;+IojQI*W`OJ-cf(5~zstvYB;%xbI> zLODKQ{-UVq%?bh_4hAp-b5`Mdlx#ZTRZc6cMhN-0hbxZIjrMrnme>-E$l)SW=R((XexQn z;a039TsM>qu6q^)kHV+ZwBIJ_nb;7kz+R)?tLhdiR5BKUv%`bQty?p(qaDCTQ7&)? z&Ycc>Re1%y%XUWz4%dN8)`jUPn%9g zNTU}Rz$HNaYc@SR!*sZf)a@WlHWs#%q6ypZ2v@%I(9b8484o*m^70j{ua2>NTAgZ@YEo_V~Mbwh9 z>)VPVuJsF+?6kd*M6DyvLjM2}rro1CelxlM_-iH%WJa%Xxx=i_gD_K zi{ocw;f-EGt@Bz)GJoB!s6})zoSEX*TAa3*9%NE7_8=PStvp8?qGu(K-W&s5GAs80 z)tE=kjlnV8*2Z?Z-cNk8p?Laxj~CQ5iO<#TRT;W~!Mo1yLoE^YH)u?{xpbblDh+$gR(iTT%`-{)kup?{` zYWTV(6$e0iP$K=k+earPjGWg~qiTXcB5wUgde;pj5()29*j==44oD)RP)xYW$F4&n zO&M8UO}>QHXMx4iI?5Xj%8~b0xxF)5GDU_tDmr@A>wQ8=qr@O1DdkuXpXh6vQE2E= zPh+OJZzd&Jls@ywC$Hn$t4gml$n6GpjO_>0-m;*&ic5l~99*HvSIFo3)~=tZ$$Xfc z#*LG=9)qn-t}E(9CYm`VD-$7ZPtBdQ;i(HNkgOHST(M9={3_keoKcTE=OA*-2_x|b zwJbhD#27}52i*~#)h!f^;d2zSHsQY~AxOciR*?y!T%W3ra%-g#4agP*nG;t#*9Ss(Cc| zv==SSMwNE(Ij2V=k&frJW!+vpQI_=frd!;|>>Y+EQe)*sPY`KwMOC;0J^lvayIWa79BT63oxL10#k`Fhxs6rdF9HlHrrjSlo<^HZVSwV$7^y$29WF zn8xWi=i3z}jk?J=jY^hr^MlT6!M1qWqi_l?a0uh`sO3dD5(|W~DFmYd#t`81_|$Tw zZ}OCIqxjVFYP{>cqy6I{Q^0?lZ_=Lrd5MqP0x;+9)jM=0T%HINgPxwPODqT*bVZvT ziQrRh%=;0V=rA0y0C7@G7${g~La*uv%}E0Y&iq__q0qa$_Tp#+nf_bNPVQQ> zrg@~xy0SBK^7N}vyR#vhJBNgv5;(`bRfTfb+T@x&jTpu{g~_TnHZn<>B0f>*RPaq* zGAwslv~M;b20`uhs_S)gdn}1I5l;vharw|Q9xXC>cP5>1(p(d`z~kiu>rT46nn1SK zNiD30sX{P+8ovXWFD6p?pBN>3ifz7{vPCqK<@XE~JdAr)2(K0Hs|~V3*6t!gHn(0q zb5hN5GRqCt69LBnay@F`EAzuK+X@ULbit`0NM&|V*cjzleeeFgCKs`rHPYDXv3WaD z*|#Ap*EP8oqYccCCXyKD>6*yZEd1!R6EgXKA>28~sH`dAiCh8pfhRx$?$5mm1W{yVb@}54m#`wnK<{u7fQM7-%cpP=lYNnRA*3X|gHaYvnc^=$Sc#;{D!`h1% z5)ZS!e=5=~rc9D(@|a6Ak(0%0#bhLiF+Vq@WJKmU!R%{d8H`S?oU3%MnHZ)-)@}nF zecrVlwmi&sHD>1Jqz*HT)fmS-b*ZrKE#v@#I#xrWMk+@&tu%*e2d!0ovJCOKRhhD! zc{O$}fK`2%JXDF0Xae7Avu>qXlec- zRw6$sT1Pko8K`vF)RC)ky3RfJ$jq(PM_QXem99yaa8=i$k%LOkUL-00v%XJHrBR#h zra9Vi`zy_O5j zzEAo*$TQ|B{&=ZO*AiMKy~Kg=Pw!W$A4;gGGD5H37|A@-;C8iryMYVJ`%)O+vrJqx zQ)DMVdef6ths-wDaLO5n_jsat%$F}D(UfvNP`wYmHRT(X*;TMRjN*i~3z|xh$P!2u zf{vhY4M8#?$&>&ym2BXOjie(OAgS~mQ0(rQa50}sRtuBED@PV%l#)Nakx<1qlxK?S zLSvWa1oMOSsNuJcMqslt#zsiSa7Vo?)5#K#B|~Gm?kED>W9=4UiEQMJr_iB}G#(+mpuAfNF$FZX#=yGHpi#Ab>gg)0*W% zm05!Kz{XFtW=$M$%3fWLr1GuOs@_2)%#&D@N6rEPlR^Wo(q1WT<%?jA-=~-}yWX=N z-(|$2RtUiGcJ=yVs#;AfA!5D)JB1%B5JoEOJL7oX?pXYcWXKOW`qfw#q_D?v5EI;U z0r^hh$sV|>*S7A_7Y=it3h;4PX4Kh=gL0C { + return ` + + + + + FSO Example App + + + +
+

Full Stack Example App

+

This application demonstrates traditional web development concepts:

+
    +
  • HTTP GET requests
  • +
  • Dynamically generated HTML pages
  • +
  • Client-side JavaScript execution
  • +
  • Event handlers and callback functions
  • +
  • Asynchronous data fetching
  • +
+
+ Number of notes created: ${noteCount} +
+ View Notes + Developer laptop +
+ + + ` +} + +const getNotesPageHtml = () => { + return ` + + + + + Notes - FSO Example App + + + +
+

Notes

+

← Back to home

+ +
+

What's happening here?

+

When this page loads:

+
    +
  1. Browser fetches the HTML document
  2. +
  3. Browser finds a <script> tag and fetches main.js
  4. +
  5. JavaScript code executes and makes an HTTP GET request to /data.json
  6. +
  7. When data arrives, a callback function processes it
  8. +
  9. The notes are dynamically rendered to the page
  10. +
+

Open your browser's Developer Console (F12) and check the Network tab!

+
+ +
+

Loading notes...

+
+ +
+

Create a New Note

+
+ + +
+
+
+ + + + + ` +} + +app.get('/', (req, res) => { + const page = getFrontPageHtml(notes.length) + res.send(page) +}) + +app.get('/notes', (req, res) => { + const page = getNotesPageHtml() + res.send(page) +}) + +app.get('/data.json', (req, res) => { + res.json(notes) +}) + +app.post('/get_notes', (req, res) => { + const localNotes = req.body.localNotes || [] + const allNotes = notes.concat(localNotes) + res.json(allNotes) +}) + +app.post('/new_note', (req, res) => { + const note = req.body.note + + if (note) { + console.log('Note received (not saved to server):', note) + } + + res.redirect('/notes') +}) + +const PORT = 3001 +app.listen(PORT, () => { + console.log(`Server running on http://localhost:${PORT}`) +}) From 2dfba37ce6641cbf10c87aab7e0a9e97414b55c0 Mon Sep 17 00:00:00 2001 From: sembauke Date: Mon, 24 Nov 2025 13:32:24 +0100 Subject: [PATCH 3/5] fix: lint --- .../package-lock.json | 2410 ++++++++--------- apps/full-stack-open-notes-app/package.json | 44 +- .../public/form-handler.js | 61 +- apps/full-stack-open-notes-app/public/main.js | 38 +- apps/full-stack-open-notes-app/server.js | 104 +- port-map.json | 2 +- 6 files changed, 1331 insertions(+), 1328 deletions(-) diff --git a/apps/full-stack-open-notes-app/package-lock.json b/apps/full-stack-open-notes-app/package-lock.json index e6573314..884b4a89 100644 --- a/apps/full-stack-open-notes-app/package-lock.json +++ b/apps/full-stack-open-notes-app/package-lock.json @@ -1,1209 +1,1209 @@ { - "name": "fso-notes-app", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "fso-notes-app", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "express": "^4.18.2" - }, - "devDependencies": { - "nodemon": "^3.0.1" - } - }, - "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/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "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/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/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-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/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/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/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/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/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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/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/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.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/nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "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/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/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/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "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/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "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/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "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/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "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/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "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" - } + "name": "fso-notes-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fso-notes-app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.18.2" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-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/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/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/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/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/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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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/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.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/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "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/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "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" + } } + } } diff --git a/apps/full-stack-open-notes-app/package.json b/apps/full-stack-open-notes-app/package.json index 4e965bdd..1140af06 100644 --- a/apps/full-stack-open-notes-app/package.json +++ b/apps/full-stack-open-notes-app/package.json @@ -1,23 +1,23 @@ { - "name": "fso-notes-app", - "version": "1.0.0", - "description": "Example application demonstrating traditional web development concepts from Full Stack Open Part 0", - "main": "server.js", - "scripts": { - "start": "node server.js", - "dev": "nodemon server.js" - }, - "keywords": [ - "express", - "fullstack", - "example" - ], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.18.2" - }, - "devDependencies": { - "nodemon": "^3.0.1" - } -} \ No newline at end of file + "name": "fso-notes-app", + "version": "1.0.0", + "description": "Example application demonstrating traditional web development concepts from Full Stack Open Part 0", + "main": "server.js", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js" + }, + "keywords": [ + "express", + "fullstack", + "example" + ], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^4.18.2" + }, + "devDependencies": { + "nodemon": "^3.0.1" + } +} diff --git a/apps/full-stack-open-notes-app/public/form-handler.js b/apps/full-stack-open-notes-app/public/form-handler.js index 34df474c..13682036 100644 --- a/apps/full-stack-open-notes-app/public/form-handler.js +++ b/apps/full-stack-open-notes-app/public/form-handler.js @@ -1,41 +1,44 @@ function getLocalNotes() { - const stored = localStorage.getItem('userNotes') - return stored ? JSON.parse(stored) : [] + const stored = localStorage.getItem('userNotes'); + return stored ? JSON.parse(stored) : []; } function saveLocalNote(note) { - const localNotes = getLocalNotes() - localNotes.push(note) - localStorage.setItem('userNotes', JSON.stringify(localNotes)) + const localNotes = getLocalNotes(); + localNotes.push(note); + localStorage.setItem('userNotes', JSON.stringify(localNotes)); } document.addEventListener('DOMContentLoaded', function () { - const form = document.querySelector('form') + const form = document.querySelector('form'); - if (form) { - form.addEventListener('submit', function (e) { - e.preventDefault() + if (form) { + form.addEventListener('submit', function (e) { + e.preventDefault(); - const input = form.querySelector('input[name="note"]') - const noteContent = input.value.trim() + const input = form.querySelector('input[name="note"]'); + const noteContent = input.value.trim(); - if (noteContent) { - const newNote = { - content: noteContent, - date: new Date().toISOString().split('T')[0], - important: false - } + if (noteContent) { + const newNote = { + content: noteContent, + date: new Date().toISOString().split('T')[0], + important: false + }; - saveLocalNote(newNote) + saveLocalNote(newNote); - var xhr = new XMLHttpRequest() - xhr.open('POST', '/new_note', true) - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') - xhr.onload = function () { - window.location.reload() - } - xhr.send('note=' + encodeURIComponent(noteContent)) - } - }) - } -}) + var xhr = new XMLHttpRequest(); + xhr.open('POST', '/new_note', true); + xhr.setRequestHeader( + 'Content-Type', + 'application/x-www-form-urlencoded' + ); + xhr.onload = function () { + window.location.reload(); + }; + xhr.send('note=' + encodeURIComponent(noteContent)); + } + }); + } +}); diff --git a/apps/full-stack-open-notes-app/public/main.js b/apps/full-stack-open-notes-app/public/main.js index e9ffdeac..4746d82a 100644 --- a/apps/full-stack-open-notes-app/public/main.js +++ b/apps/full-stack-open-notes-app/public/main.js @@ -1,28 +1,28 @@ -var xhttp = new XMLHttpRequest() +var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { - if (this.readyState == 4 && this.status == 200) { - const data = JSON.parse(this.responseText) - console.log(data) + if (this.readyState == 4 && this.status == 200) { + const data = JSON.parse(this.responseText); + console.log(data); - const stored = localStorage.getItem('userNotes') - const localNotes = stored ? JSON.parse(stored) : [] + const stored = localStorage.getItem('userNotes'); + const localNotes = stored ? JSON.parse(stored) : []; - const allNotes = data.concat(localNotes) + const allNotes = data.concat(localNotes); - var ul = document.createElement('ul') - ul.setAttribute('class', 'notes') + var ul = document.createElement('ul'); + ul.setAttribute('class', 'notes'); - allNotes.forEach(function (note) { - var li = document.createElement('li') + allNotes.forEach(function (note) { + var li = document.createElement('li'); - ul.appendChild(li) - li.appendChild(document.createTextNode(note.content)) - }) + ul.appendChild(li); + li.appendChild(document.createTextNode(note.content)); + }); - document.getElementById('notes').appendChild(ul) - } -} + document.getElementById('notes').appendChild(ul); + } +}; -xhttp.open('GET', '/data.json', true) -xhttp.send() +xhttp.open('GET', '/data.json', true); +xhttp.send(); diff --git a/apps/full-stack-open-notes-app/server.js b/apps/full-stack-open-notes-app/server.js index 97577717..55f10149 100644 --- a/apps/full-stack-open-notes-app/server.js +++ b/apps/full-stack-open-notes-app/server.js @@ -1,34 +1,34 @@ -const express = require('express') -const app = express() +const express = require('express'); +const app = express(); -app.use(express.json()) -app.use(express.urlencoded({ extended: true })) +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); -app.use(express.static('public')) +app.use(express.static('public')); let notes = [ - { - id: 1, - content: "HTML is easy", - date: "2023-1-1", - important: true - }, - { - id: 2, - content: "Browser can execute only JavaScript", - date: "2023-1-2", - important: false - }, - { - id: 3, - content: "GET and POST are the most important methods of HTTP protocol", - date: "2023-1-3", - important: true - } -] + { + id: 1, + content: 'HTML is easy', + date: '2023-1-1', + important: true + }, + { + id: 2, + content: 'Browser can execute only JavaScript', + date: '2023-1-2', + important: false + }, + { + id: 3, + content: 'GET and POST are the most important methods of HTTP protocol', + date: '2023-1-3', + important: true + } +]; -const getFrontPageHtml = (noteCount) => { - return ` +const getFrontPageHtml = noteCount => { + return ` @@ -55,11 +55,11 @@ const getFrontPageHtml = (noteCount) => { - ` -} + `; +}; const getNotesPageHtml = () => { - return ` + return ` @@ -101,40 +101,40 @@ const getNotesPageHtml = () => { - ` -} + `; +}; app.get('/', (req, res) => { - const page = getFrontPageHtml(notes.length) - res.send(page) -}) + const page = getFrontPageHtml(notes.length); + res.send(page); +}); app.get('/notes', (req, res) => { - const page = getNotesPageHtml() - res.send(page) -}) + const page = getNotesPageHtml(); + res.send(page); +}); app.get('/data.json', (req, res) => { - res.json(notes) -}) + res.json(notes); +}); app.post('/get_notes', (req, res) => { - const localNotes = req.body.localNotes || [] - const allNotes = notes.concat(localNotes) - res.json(allNotes) -}) + const localNotes = req.body.localNotes || []; + const allNotes = notes.concat(localNotes); + res.json(allNotes); +}); app.post('/new_note', (req, res) => { - const note = req.body.note + const note = req.body.note; - if (note) { - console.log('Note received (not saved to server):', note) - } + if (note) { + console.log('Note received (not saved to server):', note); + } - res.redirect('/notes') -}) + res.redirect('/notes'); +}); -const PORT = 3001 +const PORT = 3001; app.listen(PORT, () => { - console.log(`Server running on http://localhost:${PORT}`) -}) + console.log(`Server running on http://localhost:${PORT}`); +}); diff --git a/port-map.json b/port-map.json index e37e2dcc..6933c523 100644 --- a/port-map.json +++ b/port-map.json @@ -47,4 +47,4 @@ "url-shortener-microservice": 50180, "voting-app": 50185, "weather-proxy": 50190 -} \ No newline at end of file +} From aad4646148bc9a8af2167772d7f1c99013e6cfd7 Mon Sep 17 00:00:00 2001 From: sembauke Date: Tue, 25 Nov 2025 09:18:42 +0100 Subject: [PATCH 4/5] fix: use environment variable for server port configuration --- apps/full-stack-open-notes-app/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/full-stack-open-notes-app/server.js b/apps/full-stack-open-notes-app/server.js index 55f10149..d02f7d31 100644 --- a/apps/full-stack-open-notes-app/server.js +++ b/apps/full-stack-open-notes-app/server.js @@ -134,7 +134,7 @@ app.post('/new_note', (req, res) => { res.redirect('/notes'); }); -const PORT = 3001; +const PORT = process.env.PORT || 3001; app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); From 1d2f01e4fff290c73ced14b4f22489b95ac75c29 Mon Sep 17 00:00:00 2001 From: sembauke Date: Tue, 25 Nov 2025 09:23:42 +0100 Subject: [PATCH 5/5] fix: correct static file serving and add health check endpoint --- apps/full-stack-open-notes-app/server.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/full-stack-open-notes-app/server.js b/apps/full-stack-open-notes-app/server.js index d02f7d31..7464d3cc 100644 --- a/apps/full-stack-open-notes-app/server.js +++ b/apps/full-stack-open-notes-app/server.js @@ -6,6 +6,10 @@ app.use(express.urlencoded({ extended: true })); app.use(express.static('public')); +app.get('/status/ping', (req, res) => { + res.status(200).send({ msg: 'pong' }); +}); + let notes = [ { id: 1,