From 14bf57a591b592297e1fefe4df3d0aa24cad4549 Mon Sep 17 00:00:00 2001 From: Christina Milner Date: Mon, 27 Mar 2023 19:44:27 +0100 Subject: [PATCH] Copied files from repository they live in --- README.md | 29 +- package-lock.json | 2249 ++++++++++++++++++++++++++++++++++++++++ package.json | 34 + public/fms_logo.webp | Bin 0 -> 14136 bytes public/judging.js | 105 ++ public/main.js | 124 +++ public/style.css | 222 ++++ server.js | 205 ++++ views/filters.ejs | 94 ++ views/help.ejs | 46 + views/index.ejs | 24 + views/judging.ejs | 93 ++ views/registration.ejs | 76 ++ views/stats.ejs | 37 + 14 files changed, 3320 insertions(+), 18 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/fms_logo.webp create mode 100644 public/judging.js create mode 100644 public/main.js create mode 100644 public/style.css create mode 100644 server.js create mode 100644 views/filters.ejs create mode 100644 views/help.ejs create mode 100644 views/index.ejs create mode 100644 views/judging.ejs create mode 100644 views/registration.ejs create mode 100644 views/stats.ejs diff --git a/README.md b/README.md index 3236aa44b..801953b5f 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,15 @@ -#100Devs Simple Express App Submission +# Model Show Registration App -### Goal: Make Your Own CRUD APP and Push To Heroku +I used Node.js and Express to create an app for a miniatures show that would allow for the following: -### How to submit your code for review: +* Register entrants' info and assign them an incrementing ID number to label their displays with +* Accommodating Adult and Junior participants as well as In Competition (display gets judged) and Not In Competition (display does not get judged, but is still eligible for certain prizes) +* Judging the displays, keeping track of which ones are already judged, and assigning prizes +* Ensuring unique prizes like Best of Show can only be awarded once +* Viewing the prize winners in each category, separated by Adults and Juniors +* Show neat little stats like how many models were entered in total -- Fork and clone this repo -- Create a new branch called answer -- Checkout answer branch -- Push to your fork -- Issue a pull request -- Your pull request description should contain the following: - - (1 to 5 no 3) I completed the challenge - - (1 to 5 no 3) I feel good about my code - - Anything specific on which you want feedback! -Example: -``` -I completed the challenge: 5 -I feel good about my code: 4 -I'm not sure if my constructors are setup cleanly... -``` +The final version will include features like authentication to protect participants' personal data. + +This prototype is live [here on Render](https://model-show-registration-alpha-prototype.onrender.com/). diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..1de9e36c8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2249 @@ +{ + "name": "my-crud-app", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "my-crud-app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^16.0.3", + "ejs": "^3.1.8", + "env": "^0.0.2", + "express": "^4.18.2", + "mongodb": "^5.0.0" + }, + "devDependencies": { + "nodemon": "^2.0.20" + } + }, + "node_modules/@types/node": { + "version": "18.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", + "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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, + "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==" + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.0.0.tgz", + "integrity": "sha512-EL2KpZdyhshyyptj6pnQfnFKPoncD9KwZYvgmj/FXQiOUU1HWTHWmBOP4TZXU3YzStcI5qgpIl68YnMo16s26A==", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "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==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "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==" + }, + "node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/env": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/env/-/env-0.0.2.tgz", + "integrity": "sha512-yP8LfjO4ughSHD/3HgLPinWzexmaOGvRfs2TFx0SZhOm7j1xPi9evjuGcLiNVHIGLmcsgMak4eDbBzlYqGIVxw==", + "engines": { + "node": ">= 0.5.9" + } + }, + "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==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "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" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "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/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "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==", + "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 + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "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==", + "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, + "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, + "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, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.0.0.tgz", + "integrity": "sha512-WHmlbefKp/iAX2LlSZ56iKt4pRftib/dD3mDaji8R7IJcRoKPc5+/kSn3mIBxKPLVxcl73KdDKBLkQTxj1OjaA==", + "dependencies": { + "bson": "^5.0.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.201.0", + "mongodb-client-encryption": "^2.3.0", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "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==", + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "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==", + "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 + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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, + "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" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.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==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "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, + "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, + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "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 + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "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==", + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "@types/node": { + "version": "18.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz", + "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==" + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "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==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bson": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.0.0.tgz", + "integrity": "sha512-EL2KpZdyhshyyptj6pnQfnFKPoncD9KwZYvgmj/FXQiOUU1HWTHWmBOP4TZXU3YzStcI5qgpIl68YnMo16s26A==" + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "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==" + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "requires": { + "jake": "^10.8.5" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "env": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/env/-/env-0.0.2.tgz", + "integrity": "sha512-yP8LfjO4ughSHD/3HgLPinWzexmaOGvRfs2TFx0SZhOm7j1xPi9evjuGcLiNVHIGLmcsgMak4eDbBzlYqGIVxw==" + }, + "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==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "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, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "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==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "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 + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "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==" + }, + "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, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "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==" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mongodb": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.0.0.tgz", + "integrity": "sha512-WHmlbefKp/iAX2LlSZ56iKt4pRftib/dD3mDaji8R7IJcRoKPc5+/kSn3mIBxKPLVxcl73KdDKBLkQTxj1OjaA==", + "requires": { + "bson": "^5.0.0", + "mongodb-connection-string-url": "^2.6.0", + "saslprep": "^1.0.3", + "socks": "^2.7.1" + } + }, + "mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "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 + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "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==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "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 + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "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==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "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==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..608d0eb9a --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "my-crud-app", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Christina-Milner/my-first-crud-app.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/Christina-Milner/my-first-crud-app/issues" + }, + "homepage": "https://github.com/Christina-Milner/my-first-crud-app#readme", + "devDependencies": { + "nodemon": "^2.0.20" + }, + "dependencies": { + "dotenv": "^16.0.3", + "ejs": "^3.1.8", + "env": "^0.0.2", + "express": "^4.18.2", + "mongodb": "^5.0.0" + }, + "scripts": { + "start":"nodemon -e js,ejs,html -w . -w public -w views -w routes -w models server.js", + "dev": "nodemon server.js" + } +} diff --git a/public/fms_logo.webp b/public/fms_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..1edbac3c800081d080c5c330815ded56cceaa35a GIT binary patch literal 14136 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 CIZY`5 literal 0 HcmV?d00001 diff --git a/public/judging.js b/public/judging.js new file mode 100644 index 000000000..463b508aa --- /dev/null +++ b/public/judging.js @@ -0,0 +1,105 @@ +// Make all entries click to edit on DOM load + +document.addEventListener('DOMContentLoaded', function() { + document.querySelectorAll('.entry').forEach(e => e.addEventListener('click', event => { + let target = event.target.classList.contains('entry') ? event.target : event.target.parentElement.classList.contains('entry') ? event.target.parentElement : event.target.parentElement.parentElement + editThis(target) + })) + }, false); + +// This opens the editing form and populates it with the database info for the relevant entry + + async function editThis(element) { + document.querySelector('#warning').classList.add('hidden') + const entryID = element.id + const data = await fetch(`ID_${entryID}`, { + method: 'get', + headers: {'Content-Type': 'application/json'}, + }) + let json = await data.json() + document.querySelector('#inputForm').classList.remove('hidden') + document.querySelectorAll('.entry').forEach(e => e.classList.add('hidden')) + document.querySelector('#prizes').classList.remove('hidden') + document.querySelector('#forID').innerText = `Number: ${json.id}` + document.querySelector('#secretIdBox').value = json.id + document.querySelector('#name').innerText = json.fullName + document.querySelector('#numOfModels').innerText = json.numOfModels + document.querySelector('#inComp').innerText = json.inCompetition ? "In competition" : "Not in competition" + document.querySelector('#age').innerText = json.junior ? "Junior" : "Adult" + document.querySelector('#age').classList.add(json.junior ? "junior" : "adult") + if (json.judged == "N/A") { + document.querySelector('#isJudged').classList.add('hidden') + document.querySelector('#notForJudging').checked = true + document.querySelector('#forMedals').classList.add('hidden') + document.querySelector('#bestOfShow').classList.add('hidden') + document.querySelector('#forBestOfShow').classList.add('hidden') + document.querySelector('#junBestOfShow').classList.add('hidden') + document.querySelector('#forJunBestOfShow').classList.add('hidden') + } + else if (json.judged) { + document.querySelector('#yesJudged').checked = true + document.querySelector('#notJudged').checked = false + } else if (!json.judged) { + document.querySelector('#yesJudged').checked = false + document.querySelector('#notJudged').checked = true + } + + if (json.prizes && json.prizes.medal) { + let medal = json.prizes.medal + if (medal == "bronze") { + document.querySelector('#bronze').checked = true + document.querySelector('#silver').checked = false + document.querySelector('#gold').checked = false + } else if (medal == "silver") { + document.querySelector('#silver').checked = true + document.querySelector('#bronze').checked = false + document.querySelector('#gold').checked = false + } else { + document.querySelector('#gold').checked = true + document.querySelector('#silver').checked = false + document.querySelector('#bronze').checked = false + } + } + [document.querySelector('#bestOfShow'), document.querySelector('#junBestOfShow'), document.querySelector('#corrr'), document.querySelector('#peoplesChoice')].forEach(e => { + if (json.prizes && json.prizes[e.id]) { + e.checked = true + } + }) + if (json.prizes && json.prizes.sponsors) { + document.querySelector('#sponsors').value = typeof(json.prizes.sponsors) == "string" ? json.prizes.sponsors : json.prizes.sponsors.join(',') + } + if (json.junior) { + document.querySelectorAll('.adultsOnly').forEach(e => e.classList.add('hidden')) + } else { + document.querySelectorAll('.kidsOnly').forEach(e => e.classList.add('hidden')) + } +} + +// To make medals checkboxes where only one can be selected (as radio doesn't allow for unselecting) + +function onlyOne(checkbox) { + const checkboxes = document.getElementsByName('medals') + checkboxes.forEach((item) => { + if (item !== checkbox) item.checked = false + }) +} + +// To ensure People's Choice, Best of Show and Junior Best of Show can only be awarded once + +async function checkIfTaken(checkbox, prize) { + let taken = await fetch(`checkFor_${prize}`) + taken = await taken.json() + console.log(taken) + let prettyfied = {junBestOfShow: "Junior Best of Show", bestOfShow: "Best of Show", peoplesChoice: "People's Choice"} + if (taken.length && taken[0].id !== Number(document.querySelector('#secretIdBox').value)) { + checkbox.checked = false + document.querySelector('#warning').innerHTML = `${prettyfied[prize]} has already been assigned to Number ${taken[0].id}, ${taken[0].fullName}!` + document.querySelector(`[id="${taken[0].id}"]`).classList.remove('hidden') + document.querySelectorAll('.entry').forEach(e => { + if (e.id !== String(taken[0].id)) { + e.classList.add('hidden') // Make the irrelevant one go away if switching between prizes that are already taken + } + }) + document.querySelector('#warning').classList.remove('hidden') + } +} \ No newline at end of file diff --git a/public/main.js b/public/main.js new file mode 100644 index 000000000..460477326 --- /dev/null +++ b/public/main.js @@ -0,0 +1,124 @@ +/* Tasks: +Done or done-ish: +- Add default listing of all elements on page (done) +- Add "edit entry" button (done) +- Change add entry functionality so multiple people can't create an entry with the same id at the same time (done) +- Add CSS for judging page to colour differentiate not in competition / judged/ not judged (done) +- Add functionality to check for entries with empty name so that IDs don't get incremented if someone clicks "add entry" and then goes to do something else (done) +- Only prizes available for not in comp are People's Choice and Sponsor prizes (done) +- Now split up across 3 pages - all entries should always be clickable on judging page, with prizes available (done) +- Fix Not In Competition - judging form currently reverts judged back to false. Ideally don't have a judged flag at all, or at least need a value other than "false". (done) +- Add functionality to filter by prizes (done, with human-readable output) +- BIG ISSUE: Editing entry on the Registration page removes the name and # of models. FIX THIS. - Fixed - caused by an obsolete reference to the prizes section +- Get rid of "edit this entry" button and make reg entries editable like in judging view if "edit entry" is clicked - done +- Add People's Choice to filter page - done +- Add "no medal" option - presumably not everyone gets a medal - done, bronze/silver/gold are now checkboxes that do not allow multiple selections +- Ensure Junior and Adult categories are either/or and don't both show up in judging and it's clearly visible whether it's a junior - done +- Add values validation (no negative number of models etc.) - done, name & num of models are required & num of models is min 1 +- Add visual indicator what category is currently being looked at on filter results and for "edit mode" on registration page - done +- Add validation/error warning that Best in Show, Junior Best in Show and People's Choice can only be awarded once - done, now also brings up entry that has already been awarded that prize +- Separate juniors from the others in the prizes filter - done! +- Add CSS to make it look not horrible - would call this mostly done! +- Fix entries layout in filters view, broken by CSS changes - done, was caused by vertical centering +- Get rid of double border between entries - done. I still hate CSS. +- Not in competition is eligible for CORRR after all - done. +- Add Statistics to the filters - # of participants (adult/junior), # of models total - done + +To do: +*/ + +// Hack to highlight which category is being filtered by on the Filters page + +const filterButtons = document.querySelectorAll('.filterbutton') + +document.addEventListener('DOMContentLoaded', function() { + filterButtons.forEach(e => { + if (window.location.href.includes(e.id)) { + e.classList.add('active') + } + }) + }, false); + +// Other buttons + +const addButton = document.querySelector('#addButton') +const editButton = document.querySelector('#editEntries') + +if (addButton) {addButton.addEventListener('click', openAddForm)} +if (editButton) {editButton.addEventListener('click', editEntries)} + +// Highlight edit button when entries are clickable +if (editButton) {editButton.addEventListener('click', () => editButton.classList.add('active'))} + + +// Function that retrieves the next ID number when "add entry" is clicked and populates the form with it + +async function openAddForm() { + document.querySelectorAll('.entry').forEach(e => e.removeEventListener('click', event => editThis(event.target.parentElement))) + editButton.classList.remove('active') + document.querySelector('.buttonsGoHere').classList.add('hidden') + const res = await fetch('/postEntry', { + method: 'POST', + headers: { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({}) + }) + let id = await res.text() + id = Number(id) + + document.querySelector('#forID').innerText = `Number: ${id}` + document.querySelector('#inputForm').classList.remove('hidden') + document.querySelector('#secretIdBox').value = id +} + +// Function for making entries editable in Registration view + +function editEntries() { + document.querySelectorAll('.entry').forEach(e => e.addEventListener('click', event => { + let target = event.target.classList.contains('entry') ? event.target : event.target.parentElement.classList.contains('entry') ? event.target.parentElement : event.target.parentElement.parentElement + editThis(target) + })) +} + + +// Function for editing an entry on the Registration page + +async function editThis(element) { + editButton.classList.remove('active') + document.querySelector('.buttonsGoHere').classList.add('hidden') + const entryID = element.id + const data = await fetch(`ID_${entryID}`, { + method: 'get', + headers: {'Content-Type': 'application/json'}, + }) + let json = await data.json() + console.log(json) + document.querySelector('#inputForm').classList.remove('hidden') + document.querySelectorAll('.entry').forEach(e => e.classList.add('hidden')) + document.querySelector('#forID').innerText = `Number: ${json.id}` + document.querySelector('#secretIdBox').value = json.id + document.querySelector('#name').value = json.fullName + document.querySelector('#numOfModels').value = json.numOfModels + if (json.junior) { + document.querySelector('#yesJunior').checked = true + } else { + document.querySelector('#notJunior').checked = true + } + if (json.inCompetition) { + document.querySelector('#yesInComp').checked = true + document.querySelector('#notInComp').checked = false + } else { + document.querySelector('#yesInComp').checked = false + document.querySelector('#notInComp').checked = true + } + if (json.judged && json.judged !== "N/A") { + document.querySelector('#yesJudged').checked = true + } else if (json.judged == "N/A") { + document.querySelector('#notForJudging').checked = true + } else if (!json.judged) { + document.querySelector('#notJudged').checked = true + } +} + diff --git a/public/style.css b/public/style.css new file mode 100644 index 000000000..9b3fe7b44 --- /dev/null +++ b/public/style.css @@ -0,0 +1,222 @@ +@import url('https://fonts.googleapis.com/css2?family=Heebo:wght@100;200;300;400;500;600;700;800;900&display=swap'); + + +:root { + accent-color: rgb(141, 52, 141); +} + +html { + font-family: 'Heebo', sans-serif; + box-sizing: border-box; +} + +img { + width: 8rem; +} + +ul { + list-style-type: square; + width: 50%; + margin: 0 auto; +} + +header { + display: flex; + justify-content: center; + align-items: center; + gap: 3%; + margin-bottom: 2%; +} + +form { + display: flex; + flex-flow: column; + width: 70%; + margin: 0 auto; + line-height: 1.5em; + font-size: 1.5em; + font-weight: 500; + margin-bottom: 2%; +} + + +.hidden { + display: none !important; +} + +.entries { + display: flex; + flex-flow: column wrap; + width: 80%; + margin: 0 auto; +} + +.entry { + padding: 0 2%; + display: flex; + border: 2px solid grey; + border-width: 1px 2px; + gap: 1%; + line-height: 1em; +} + + +.entries .entry:first-child, h2 + .entry { + border-top: 2px solid grey; +} + +.entries .entry:last-child { + border-bottom: 2px solid grey; +} + +.titleNav, .pageNav { + display: flex; + justify-content: center; + background-color: #000; + overflow: auto; + white-space: nowrap; +} + +.titleNav > span, .pageNav > span { + padding: 1em; + font-weight: 600; + font-size: 1.5em; +} + +a { + color: #fff; + text-decoration: none; +} + +.notJudged { + background-color: #d88282; +} + +.notInComp { + background-color: #8b8b8b; +} + +.judged { + background-color: #79df93; +} + +#warning { + color: #dd1212 +} + +.active { + background-color: orange !important; +} + +.filterbuttons { + display: flex; + flex-flow: column; + justify-content: center; + color: #000; +} + +.filterbutton, .regButtons { + color: #000; + border: 1px solid black; + padding: 5px; + background-color: rgb(187, 98, 187); +} + +.iHateCSS { + display: flex; + justify-content: center; + flex-flow: row wrap; + gap: 1%; +} + +.filterbutton { + text-align: center; +} + +.small { + width: 5em; +} + +.big { + width: 10em; +} + +.regButtons { + width: 10em; + text-align: center; +} + +h1, h2 { + text-align: center; +} + +.buttonsGoHere { + display: flex; + justify-content: center; + gap: 3%; + margin-bottom: 2%; +} + +span { + padding: 0; +} + +input[type=submit], .cancel { + vertical-align: middle; + font-size: 1em; + padding: 1% 0.5%; + line-height: 1em; + border-radius: 0; + border: 1px solid black; + background-color: rgb(187, 98, 187) + +} + +.cancel { + display: inline-block; + background-color: #ec7777; + margin-left: 2%; + line-height: 1em; +} + +#age { + font-weight: 700; + color: #fff; +} + +.adult { + background-color: rgb(129, 64, 129); +} + +.junior { + background-color: rgb(230, 131, 230); +} + +.numOfThings { + display: flex; + justify-content: center; + gap: 1%; + font-size: 1.5em; + font-weight: 600; +} + +.num { + color: rgb(141, 52, 141); +} + +@media (max-width: 700px) { + .titleNav > span, .pageNav > span { + font-size: 1em; + padding: 0.75em 0.5em; + } + + ul { + width: 80%; + } + + form { + width: 90%; + line-height: 1.25em; + font-size: 1.25em; +} +} diff --git a/server.js b/server.js new file mode 100644 index 000000000..8797012fb --- /dev/null +++ b/server.js @@ -0,0 +1,205 @@ +// Standard Express and DB setup + +const express = require('express') +const app = express() +const MongoClient = require('mongodb').MongoClient +const PORT = 8000 +require('dotenv').config() + +let db, + dbConnectionStr = process.env.DB_STRING, + dbName = 'modelShowRegTest' + +MongoClient.connect(dbConnectionStr, { useUnifiedTopology: true }) + .then(client => { + console.log(`Connected to ${dbName} Database`) + db = client.db(dbName) + }) + +app.set('view engine', 'ejs') +app.use(express.static('public')) +app.use(express.urlencoded({ extended: true })) +app.use(express.json()) + +// Main page + +app.get('/',(request, response)=>{ + response.render('index.ejs') +}) + +// Help page + +app.get('/help',(request, response)=>{ + response.render('help.ejs') +}) + +// Registration page + +app.get('/registration',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + response.render('registration.ejs', { info: data }) + }) + .catch(error => console.error(error)) +}) + +/* Add a new entry, which is actually updating as it gets created on ID assignment */ + +app.post('/addEntryReg', (request, response) => { + console.log(request.body) + db.collection('modelShowRegTest').updateOne({ + id: Number(request.body.entryId)},{ + $set:{ + fullName: request.body.name, + numOfModels: Number(request.body.numOfModels), + inCompetition: request.body.inComp == "yesInComp", + junior: request.body.junior == "yesJunior", + judged: request.body.inComp == "yesInComp" ? request.body.judged == "yesJudged" : "N/A" + } + }) + .then(result => { + console.log('Entry Added') + response.redirect('/registration') + }) + .catch(error => console.error(error)) +}) + +/* Fetch next ID number */ + +app.get('/numOfEntries',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + response.send(String(data.length + 1)) + }) + .catch(error => console.error(error)) +}) + +/* Fetch specific entry's data, this gets used elsewhere too */ + +app.get('/ID_:id', (req, res) => { + db.collection('modelShowRegTest').findOne({id: Number(req.params.id)}) + .then(data => res.json(data)) +}) + +/* Actual POST, happens when opening add form */ + +app.post('/postEntry', (request, response) => { + db.collection('modelShowRegTest').find().toArray() + .then(res => { + let num = res.length + if (num > 0) { + let lastEntry = res[num - 1] + if (!lastEntry.fullName) { + id = lastEntry.id + console.log("Empty entry detected!") + response.send(String(id)) + return + } + } + id = num + 1 + db.collection('modelShowRegTest').insertOne({ + "id": id, + fullName: "", + numOfModels: 0, + inCompetition: false, + prizes: {} + }) + console.log('Entry Added') + response.send(String(id)) + }) + .catch(error => console.error(error)) +}) + +// Judging page + +app.get('/judging',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + response.render('judging.ejs', { info: data }) + }) + .catch(error => console.error(error)) +}) + +/* Entry form on judging page, with prizes */ + +app.post('/addEntryJudge', (request, response) => { + console.log(request.body) + db.collection('modelShowRegTest').updateOne({ + id: Number(request.body.entryId)},{ + $set:{ + judged: request.body.judged == "notForJudging" ? "N/A" : request.body.judged == "yesJudged", + prizes: { + medal: request.body.medals, + bestOfShow: request.body.bestOfShow == "on", + junBestOfShow: request.body.junBestOfShow == "on", + corrr: request.body.corrr == "on", + peoplesChoice: request.body.peoplesChoice == "on", + sponsors: request.body.sponsors.split(',') + } + } + }) + .then(result => { + console.log('Entry added') + response.redirect('/judging') + }) + .catch(error => console.error(error)) +}) + + +/* Check to disallow assignment of unique prizes if already taken */ + +app.get('/checkFor_:prize',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + let prize = request.params.prize + data = data.filter(e => e["prizes"][prize]) + response.json(data) + }) + .catch(error => console.error(error)) +}) + +// Filters page + +app.get('/filters',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + response.render('filters.ejs', { info: data }) + }) + .catch(error => console.error(error)) +}) + +/* Filtering by particular prize */ + +app.get('/filters:prize',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + let prize = request.params.prize + data = data.filter(e => { + if (prize == "sponsors") { + return e.prizes[prize] ? e.prizes[prize].join('') !== "" : false + } else { + return Object.values(e.prizes).includes(prize) || e.prizes[prize] + } + }) + console.log(data) + response.render('filters.ejs', { info: data }) + }) + .catch(error => console.error(error)) +}) + +// Statistics page + +app.get('/stats',(request, response)=>{ + db.collection('modelShowRegTest').find().toArray() + .then(data => { + response.render('stats.ejs', { info: data }) + }) + .catch(error => console.error(error)) +}) + + +// Hello + +app.listen(process.env.PORT || PORT, ()=>{ + console.log(`Server running on port ${PORT}`) +}) \ No newline at end of file diff --git a/views/filters.ejs b/views/filters.ejs new file mode 100644 index 000000000..15ef91f5d --- /dev/null +++ b/views/filters.ejs @@ -0,0 +1,94 @@ + + + + + + + Prototype Modelshow Registration + + + + + + +

Miniatures Show Results

+ +

Juniors

+
+ <% let infoJuniors = info.filter(e => e.junior) + for(let i = 0; i < infoJuniors.length; i++) {%> +
> +
+

Number:

+

Name:

+
+
+

<%= infoJuniors[i].id %>

+

<%= infoJuniors[i].fullName %>

+

<% for (let prize of Object.keys(infoJuniors[i].prizes).filter(e => infoJuniors[i].prizes[e])) {%> + <% let prettyfied = {junBestOfShow: "Junior Best of Show", bestOfShow: "Best of Show", peoplesChoice: "People's Choice"} %> + <%- typeof(infoJuniors[i].prizes[prize]) == "string" ? infoJuniors[i].prizes[prize][0].toUpperCase() + infoJuniors[i].prizes[prize].slice(1) + "
" : + prize == "corrr" ? prize.toUpperCase() + "
" : + prize in prettyfied ? prettyfied[prize] + "
" : + typeof(infoJuniors[i].prizes[prize]) == "object" ? + infoJuniors[i].prizes[prize].every(e => !e) ? "" : + "Sponsor: " + infoJuniors[i].prizes[prize] + "
" : + prize + "
" %> +
+ <% } %> +

+
+
+ <% } %> +
+

Adults

+
+ <% let infoAdults = info.filter(e => !e.junior) + for(let i = 0; i < infoAdults.length; i++) {%> +
> +
+

Number:

+

Name:

+
+
+

<%= infoAdults[i].id %>

+

<%= infoAdults[i].fullName %>

+

<% for (let prize of Object.keys(infoAdults[i].prizes).filter(e => infoAdults[i].prizes[e])) {%> + <% let prettyfied = {junBestOfShow: "Junior Best of Show", bestOfShow: "Best of Show", peoplesChoice: "People's Choice"} %> + <%- typeof(infoAdults[i].prizes[prize]) == "string" ? infoAdults[i].prizes[prize][0].toUpperCase() + infoAdults[i].prizes[prize].slice(1) + "
" : + prize == "corrr" ? prize.toUpperCase() + "
" : + prize in prettyfied ? prettyfied[prize] + "
" : + typeof(infoAdults[i].prizes[prize]) == "object" ? + infoAdults[i].prizes[prize].every(e => !e) ? "" : + "Sponsor: " + infoAdults[i].prizes[prize] + "
" : + prize + "
" %> +
+ <% } %> +

+
+
+ <% } %> +
+ + + \ No newline at end of file diff --git a/views/help.ejs b/views/help.ejs new file mode 100644 index 000000000..9873e423f --- /dev/null +++ b/views/help.ejs @@ -0,0 +1,46 @@ + + + + + + + Prototype Modelshow Registration + + + + + +
+ +

Fen Model Show

+
+ +

Registration

+
    +
  • Click "Add Entry" to add a participant
  • +
  • The form will automatically generate the next ID for you to assign the contestant
  • +
  • If you make a mistake, click "Edit" - this makes all entries on the page clickable
  • +
  • Click the desired entry and the form will reopen for you to make any corrections
  • +
  • If you click away from the form without filling it out, the ID will not increment next time you open it
  • +
+

Judging

+
    +
  • Participant info is not editable on this page - use Registration if this is needed
  • +
  • All entries are clickable to open a form to flag them as judged and assign prizes
  • +
  • Grey entries are "not in competition", but can be assigned People's Choice and sponsor prizes
  • +
  • Red entries are in competition and have not been judged yet
  • +
  • Green antries are in competition and have been judged, but you can change or amend prizes by clicking again
  • +
  • You cannot award a unique prize (like Best of Show) a second time, but it will bring up the existing entry with that prize if you wish to change your mind
  • +
+

Filters

+
    +
  • Use the buttons to view the winners of each category, listed by Juniors and Adults
  • +
+ + \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 000000000..a11f60eea --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,24 @@ + + + + + + + Prototype Modelshow Registration + + + + + +
+ +

Fen Model Show

+
+ + \ No newline at end of file diff --git a/views/judging.ejs b/views/judging.ejs new file mode 100644 index 000000000..8245eb275 --- /dev/null +++ b/views/judging.ejs @@ -0,0 +1,93 @@ + + + + + + + Prototype Modelshow Registration + + + + + + + +

Miniatures Show Judging

+ +
+ <% for(let i = 0; i < info.length; i++) {%> +
" id=<%= info[i].id %>> +
+

Number:

+

Name:

+

<%= info[i].junior ? "Junior" : "Adult" %>

+

Judged:

+
+
+

<%= info[i].id %>

+

<%= info[i].fullName ? info[i].fullName : "Empty entry!" %>

+

 

+

<%= !info[i].judged ? "No" : info[i].judged == "N/A" ? "N/A" : "Yes" %>

+
+
+ <% } %> +
+ \ No newline at end of file diff --git a/views/registration.ejs b/views/registration.ejs new file mode 100644 index 000000000..adc7a3f07 --- /dev/null +++ b/views/registration.ejs @@ -0,0 +1,76 @@ + + + + + + + Prototype Modelshow Registration + + + + + + + +

Register entrants

+
+ Add Entry + Edit +
+ +
+ <% for(let i = 0; i < info.length; i++) {%> +
> +
+

Number:

+

Name:

+
+
+

<%= info[i].id %>

+

<%= info[i].fullName %>

+
+
+ <% } %> +
+ \ No newline at end of file diff --git a/views/stats.ejs b/views/stats.ejs new file mode 100644 index 000000000..a41372487 --- /dev/null +++ b/views/stats.ejs @@ -0,0 +1,37 @@ + + + + + + + Prototype Modelshow Registration + + + + + + +

Number of participants

+
+
+

Total:

+

Juniors:

+

Adults:

+
+
+

<%= info.length %>

+

<%= info.filter(e => e.junior).length %>

+

<%= info.filter(e => !e.junior).length %>

+
+
+

Number of models entered

+
+

<%= info.reduce((a, b) => a + b.numOfModels, 0) %>

+
+ \ No newline at end of file