From 1cd5673d387f541a099a9bb79165f98f3f152a27 Mon Sep 17 00:00:00 2001 From: Andrey Bejarano Date: Wed, 10 Aug 2022 00:02:51 -0300 Subject: [PATCH] clase25 --- clase25/.gitignore | 46 + clase25/package-lock.json | 1519 +++++++++++++++++++++ clase25/package.json | 18 + clase25/public/css/app.css | 8 + clase25/public/images/node.jpg | Bin 0 -> 73608 bytes clase25/src/app.js | 51 + clase25/src/bin/www | 97 ++ clase25/src/controllers/mainController.js | 10 + clase25/src/logs/userLogs.txt | 7 + clase25/src/middlewares/logger.js | 11 + clase25/src/middlewares/user.js | 22 + clase25/src/routes/main.js | 12 + clase25/src/views/admin.ejs | 12 + clase25/src/views/error.ejs | 40 + clase25/src/views/index.ejs | 13 + 15 files changed, 1866 insertions(+) create mode 100644 clase25/.gitignore create mode 100644 clase25/package-lock.json create mode 100644 clase25/package.json create mode 100644 clase25/public/css/app.css create mode 100644 clase25/public/images/node.jpg create mode 100644 clase25/src/app.js create mode 100644 clase25/src/bin/www create mode 100644 clase25/src/controllers/mainController.js create mode 100644 clase25/src/logs/userLogs.txt create mode 100644 clase25/src/middlewares/logger.js create mode 100644 clase25/src/middlewares/user.js create mode 100644 clase25/src/routes/main.js create mode 100644 clase25/src/views/admin.ejs create mode 100644 clase25/src/views/error.ejs create mode 100644 clase25/src/views/index.ejs diff --git a/clase25/.gitignore b/clase25/.gitignore new file mode 100644 index 0000000..70c0d7b --- /dev/null +++ b/clase25/.gitignore @@ -0,0 +1,46 @@ +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Another Specials # +#################### +*.yml +*.cfg +.htaccess +*.config +node_modules/ +.vscode/ \ No newline at end of file diff --git a/clase25/package-lock.json b/clase25/package-lock.json new file mode 100644 index 0000000..1490b81 --- /dev/null +++ b/clase25/package-lock.json @@ -0,0 +1,1519 @@ +{ + "name": "baseapphtml", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "baseapphtml", + "version": "0.0.0", + "dependencies": { + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "ejs": "~2.6.1", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "morgan": "~1.9.1", + "nodemon": "^2.0.1", + "normalize.css": "^8.0.1" + } + }, + "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==" + }, + "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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "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/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/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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/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.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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": "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/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "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": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", + "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/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.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dependencies": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "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==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "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==" + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "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/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.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "bin": { + "mime": "cli.js" + } + }, + "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/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.19", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", + "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "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/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "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==", + "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==" + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "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.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "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==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "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/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "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==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "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==" + }, + "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" + } + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "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" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "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==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "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==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "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": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "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.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==" + } + } + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "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==", + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.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==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "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==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "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==", + "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==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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==" + }, + "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==" + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "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" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.19", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", + "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "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" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "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==" + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "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==" + }, + "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==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "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.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "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==" + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "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==" + }, + "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==" + } + } +} diff --git a/clase25/package.json b/clase25/package.json new file mode 100644 index 0000000..c9aa95a --- /dev/null +++ b/clase25/package.json @@ -0,0 +1,18 @@ +{ + "name": "baseapphtml", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "nodemon ./src/bin/www" + }, + "dependencies": { + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "ejs": "~2.6.1", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "morgan": "~1.9.1", + "nodemon": "^2.0.1", + "normalize.css": "^8.0.1" + } +} diff --git a/clase25/public/css/app.css b/clase25/public/css/app.css new file mode 100644 index 0000000..f285e9f --- /dev/null +++ b/clase25/public/css/app.css @@ -0,0 +1,8 @@ +* { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: sans-serif; +} \ No newline at end of file diff --git a/clase25/public/images/node.jpg b/clase25/public/images/node.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9875b7e0b3fa9d029e50235351d389151e4c22cf GIT binary patch literal 73608 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

0T4e=^R~HnroM2 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 next(createError(404))); + +// ************ error handler ************ +app.use((err, req, res, next) => { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.path = req.path; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +// ************ exports app - dont'touch ************ +module.exports = app; diff --git a/clase25/src/bin/www b/clase25/src/bin/www new file mode 100644 index 0000000..70087b2 --- /dev/null +++ b/clase25/src/bin/www @@ -0,0 +1,97 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +const app = require('../app'); +const debug = require('debug')('baseapphtml:server'); +const http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +const port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +const server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port, () => { + console.log(`\\*-------------------------*\\`); + console.log(`Server running in ${port} port`); + console.log(`Now, you can open http://localhost:${port} in your favorite browser `); + console.log(`Happy programming and never stop learning!`); + + console.log(`\\*-------------------------*\\`); +}); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + const port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + const bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + const addr = server.address(); + const bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/clase25/src/controllers/mainController.js b/clase25/src/controllers/mainController.js new file mode 100644 index 0000000..5380c2a --- /dev/null +++ b/clase25/src/controllers/mainController.js @@ -0,0 +1,10 @@ +const controller = { + index: (req, res) => { + res.render('index'); + }, + admin: (req, res) => { + res.render('admin', { user: req.user }); + } +} + +module.exports = controller; \ No newline at end of file diff --git a/clase25/src/logs/userLogs.txt b/clase25/src/logs/userLogs.txt new file mode 100644 index 0000000..f4dbfa3 --- /dev/null +++ b/clase25/src/logs/userLogs.txt @@ -0,0 +1,7 @@ +El usuario ingresó a la ruta: / +El usuario ingresó a la ruta: /admin +El usuario ingresó a la ruta: /admin +El usuario ingresó a la ruta: /admin +El usuario ingresó a la ruta: /admin +El usuario ingresó a la ruta: /admin +El usuario ingresó a la ruta: /admin diff --git a/clase25/src/middlewares/logger.js b/clase25/src/middlewares/logger.js new file mode 100644 index 0000000..44dc17b --- /dev/null +++ b/clase25/src/middlewares/logger.js @@ -0,0 +1,11 @@ +const fs = require('fs'); +const path = require('path'); + +const loggerMiddleware = (req, res, next) => { + const logFilePath = path.resolve(__dirname, '../logs/userLogs.txt'); + const message = `El usuario ingresó a la ruta: ${req.path}\n`; + fs.appendFileSync(logFilePath, message); + next(); +}; + +module.exports = loggerMiddleware; \ No newline at end of file diff --git a/clase25/src/middlewares/user.js b/clase25/src/middlewares/user.js new file mode 100644 index 0000000..fd0eea9 --- /dev/null +++ b/clase25/src/middlewares/user.js @@ -0,0 +1,22 @@ +const userMiddleware = (req, res, next) => { + const users = [ + 'ada', + 'greta', + 'vim', + 'tim' + ]; + const user = req.query.user?.toLowerCase(); + if(users.includes(user)) { + req.user = user; + return next(); + } + res.render('error', { + message: 'No tienes los privilegios para ingresar', + error: { + status: 401 + }, + path: req.url + }); +} + +module.exports = userMiddleware; \ No newline at end of file diff --git a/clase25/src/routes/main.js b/clase25/src/routes/main.js new file mode 100644 index 0000000..2d66367 --- /dev/null +++ b/clase25/src/routes/main.js @@ -0,0 +1,12 @@ +const express = require('express'); + +const mainController = require('../controllers/mainController'); + +const userMiddleware = require('../middlewares/user'); + +const router = express.Router(); + +router.get('/', mainController.index); +router.get('/admin', userMiddleware, mainController.admin); + +module.exports = router; \ No newline at end of file diff --git a/clase25/src/views/admin.ejs b/clase25/src/views/admin.ejs new file mode 100644 index 0000000..a35ca05 --- /dev/null +++ b/clase25/src/views/admin.ejs @@ -0,0 +1,12 @@ + + + + + + + Document + + +

Hola admin: <%= user %>

+ + \ No newline at end of file diff --git a/clase25/src/views/error.ejs b/clase25/src/views/error.ejs new file mode 100644 index 0000000..8fd844e --- /dev/null +++ b/clase25/src/views/error.ejs @@ -0,0 +1,40 @@ + + + + + + Houston - ¡We have an ERROR! + + + +

<%= message %>

+

<%= error.status %>

+

Error trying to access to: <%= path %>

+ + diff --git a/clase25/src/views/index.ejs b/clase25/src/views/index.ejs new file mode 100644 index 0000000..1ae36f4 --- /dev/null +++ b/clase25/src/views/index.ejs @@ -0,0 +1,13 @@ + + + + + + Home Page + + + +

Home Page

+ + + \ No newline at end of file