├── .dockerignore ├── .github ├── ISSUE_TEMPLATE │ └── bug.md └── workflows │ ├── code-quality.yml │ └── deploy.yml ├── .gitignore ├── .prettierignore ├── Dockerfile ├── LICENSE ├── README.md ├── assets ├── cmd.css ├── common.js ├── index.js ├── list.css ├── login.css ├── login.js ├── multi.js ├── navbar.css ├── rename.js ├── shell.js ├── tooltip.js ├── upload.css └── upload.js ├── index.js ├── package-lock.json ├── package.json └── views ├── cmd.handlebars ├── layouts └── main.handlebars ├── list.handlebars ├── login.handlebars ├── partials ├── dialogue-cmd.handlebars ├── dialogue-delete.handlebars ├── dialogue-download.handlebars ├── dialogue-mkdir.handlebars ├── dialogue-rename.handlebars ├── dialogue-upload.handlebars ├── navbar.handlebars └── toolbar.handlebars └── shell.handlebars /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | .git/ 4 | .github/ 5 | .gitignore 6 | Dockerfile* 7 | LICENSE 8 | README.md 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug 3 | about: Report a bug 4 | title: "" 5 | labels: bug 6 | assignees: "" 7 | --- 8 | 9 | ### Describe the problem 10 | 11 | (Give a concise description of the problem) 12 | 13 | ### Steps to reproduce 14 | 15 | 1. (Detail every step) 16 | 17 | ### Screenshots or logs 18 | 19 | (Attach logs as GitHub Gists) 20 | -------------------------------------------------------------------------------- /.github/workflows/code-quality.yml: -------------------------------------------------------------------------------- 1 | name: Code Quality 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | format: 11 | name: Format 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | 17 | - name: Use Node.js 16.x 18 | uses: actions/setup-node@v2 19 | with: 20 | node-version: 16.x 21 | cache: "npm" 22 | 23 | - run: npm ci 24 | 25 | - run: npx prettier --check . 26 | # vim: set et ts=2 sw=2: 27 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | push: 5 | tags: ["v*"] 6 | branches: [main] 7 | 8 | env: 9 | REGISTRY: docker.io 10 | IMAGE_NAME: ${{ github.repository }} 11 | 12 | jobs: 13 | publish: 14 | name: Publish 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v2 19 | 20 | - name: Set up QEMU 21 | uses: docker/setup-qemu-action@v1 22 | 23 | - name: Set up Docker Buildx 24 | uses: docker/setup-buildx-action@v1 25 | 26 | - name: Docker Login 27 | uses: docker/login-action@v1 28 | with: 29 | registry: ${{ env.REGISTRY }} 30 | username: ${{ secrets.DOCKERHUB_USERNAME }} 31 | password: ${{ secrets.DOCKERHUB_TOKEN }} 32 | 33 | - name: Generate Docker tags 34 | uses: docker/metadata-action@v3 35 | with: 36 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 37 | tags: | 38 | type=ref,event=branch 39 | type=ref,event=pr 40 | type=semver,pattern={{version}} 41 | type=semver,pattern={{major}}.{{minor}} 42 | id: meta 43 | 44 | - name: Build and push Docker images 45 | uses: docker/build-push-action@v2 46 | with: 47 | pull: true 48 | platforms: linux/amd64 49 | push: true 50 | tags: ${{ steps.meta.outputs.tags }} 51 | labels: ${{ steps.meta.outputs.labels }} 52 | # vim: set et ts=2 sw=2: 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | views/**/*.handlebars 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-bullseye 2 | 3 | ENV NODE_ENV=production 4 | 5 | COPY . /usr/local/share/file-manager 6 | RUN cd /usr/local/share/file-manager \ 7 | && npm install . \ 8 | && rm -rf ~/.npm ~/.cache 9 | 10 | WORKDIR /data 11 | 12 | CMD ["node", "/usr/local/share/file-manager/index.js"] 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Ambrose Chua 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # file-manager 2 | 3 | A basic node.js file manager. 4 | 5 | ## Features 6 | 7 | - [x] [Simple authentication](https://github.com/ambrosechua/file-manager#key) 8 | - [x] Directory browsing 9 | - [x] Filesize 10 | - [ ] Permissions 11 | - [ ] Owner 12 | - [x] Folder creation 13 | - [x] File uploads 14 | - [ ] Bulk file uploads 15 | - [ ] Large file uploads (sharded) 16 | - [x] File/folder renaming 17 | - [x] Previews for small image files 18 | - [x] Bulk file/folder selection 19 | - [x] Delete 20 | - [x] Recursive directory delete 21 | - [ ] Move 22 | - [ ] Copy 23 | - [x] Download archive 24 | - [ ] Change permissions 25 | - [x] Remote commands 26 | 27 | ## Usage 28 | 29 | For users who prefer Docker: 30 | 31 | ```zsh 32 | docker run --rm -it -v $PWD:/data -p 8080:8080 serverwentdown/file-manager 33 | ``` 34 | 35 | Or if you have Node.js installed: 36 | 37 | ```zsh 38 | npm install -g https://github.com/serverwentdown/file-manager.git 39 | file-manager 40 | ``` 41 | 42 | ## Screenshots 43 | 44 | These screenshots are not up-to-date. 45 | 46 | ![](https://ambrose.makerforce.io/file-manager/login1.png) 47 | 48 | ![](https://ambrose.makerforce.io/file-manager/upl2.png) 49 | 50 | ![](https://ambrose.makerforce.io/file-manager/ls1.png) 51 | 52 | ![](https://ambrose.makerforce.io/file-manager/rm1.png) 53 | 54 | ![](https://ambrose.makerforce.io/file-manager/dl1.png) 55 | 56 | ## Options 57 | 58 | The following environmental variables can be used to configure `file-manager`. 59 | 60 | ### SESSION_KEY= 61 | 62 | Express session key, generate something random. 63 | 64 | ### SHELL= 65 | 66 | Enable the shell feature, which allows users to start a login shell (when set to `login`) or the binary specified by this option (example: `/bin/bash`). Be careful when enabling this feature as anyone with access to this portal can execute any command on your machine. 67 | 68 | ### CMD= 69 | 70 | Set to something other than "false" to enable running single commands in the default shell, usually `/bin/sh`. Be careful when enabling this feature as anyone with access to this portal can execute any command on your machine. 71 | 72 | ### PORT= 73 | 74 | Listen on $PORT. Default: 8080 75 | 76 | ### KEY= 77 | 78 | Setting this variable enables authentication using TOTP (RFC6238). $KEY is a base32 encoded shared secret. This key is only a weak means of protection as it is succeptable to brute-force. You can generate one from [here](http://www.xanxys.net/totp/) or manually. 79 | -------------------------------------------------------------------------------- /assets/cmd.css: -------------------------------------------------------------------------------- 1 | .cmd { 2 | word-wrap: break-word; 3 | } 4 | pre { 5 | background-color: #eee; 6 | min-height: 1.5em; 7 | } 8 | -------------------------------------------------------------------------------- /assets/common.js: -------------------------------------------------------------------------------- 1 | function htmlEscape(text) { 2 | const p = document.createElement("p"); 3 | p.innerText = text; 4 | return p.innerHTML; 5 | } 6 | -------------------------------------------------------------------------------- /assets/index.js: -------------------------------------------------------------------------------- 1 | const assets = [ 2 | { 3 | path: "bootstrap", 4 | modulePath: "bootstrap/dist", 5 | }, 6 | { 7 | path: "jquery", 8 | modulePath: "jquery/dist", 9 | }, 10 | { 11 | path: "octicons", 12 | modulePath: "@primer/octicons/build", 13 | }, 14 | { 15 | path: "filesize", 16 | modulePath: "filesize/lib", 17 | }, 18 | { 19 | path: "xterm", 20 | modulePath: "xterm", 21 | }, 22 | { 23 | path: "xterm-addon-attach", 24 | modulePath: "xterm-addon-attach", 25 | }, 26 | { 27 | path: "xterm-addon-fit", 28 | modulePath: "xterm-addon-fit", 29 | }, 30 | ]; 31 | 32 | module.exports = assets; 33 | -------------------------------------------------------------------------------- /assets/list.css: -------------------------------------------------------------------------------- 1 | .name { 2 | overflow: hidden; 3 | word-wrap: break-word; 4 | } 5 | .badge-alignment { 6 | margin-top: 0.25em; 7 | } 8 | .stretched-invisible-label { 9 | display: block; 10 | } 11 | .stretched-invisible-label > * { 12 | position: relative; 13 | z-index: 1; 14 | } 15 | .stretched-invisible-label::after { 16 | content: ""; 17 | position: absolute; 18 | top: 0; 19 | right: 0; 20 | bottom: 0; 21 | left: 0; 22 | z-index: 0; 23 | } 24 | -------------------------------------------------------------------------------- /assets/login.css: -------------------------------------------------------------------------------- 1 | .input-group-digits .form-control { 2 | font-size: 2rem; 3 | padding: 0.5rem 0; 4 | 5 | width: 2.75rem; 6 | text-align: center; 7 | font-weight: 300; 8 | } 9 | 10 | .input-group-digits input[type="number"] { 11 | -moz-appearance: textfield; 12 | } 13 | .input-group-digits input[type="number"]::-webkit-inner-spin-button, 14 | .input-group-digits input[type="number"]::-webkit-outer-spin-button { 15 | -webkit-appearance: none; 16 | margin: 0; 17 | } 18 | 19 | .login { 20 | width: 19.2em; 21 | } 22 | -------------------------------------------------------------------------------- /assets/login.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | let $inputs = $(".input-group-digits"); 4 | $inputs.each((i, input) => { 5 | let cleanup = () => { 6 | $(input) 7 | .find("input") 8 | .each((i, ele) => { 9 | let cleaned = $(ele) 10 | .val() 11 | .replace(/[^0-9]/, ""); 12 | $(ele).val(cleaned); 13 | }); 14 | }; 15 | let update = (e) => { 16 | $digits = $(input).find("input"); 17 | 18 | // Cleanup 19 | cleanup(); 20 | 21 | // Shift characters 22 | let excess = ""; 23 | $digits.each((i, ele) => { 24 | let now = excess + $(ele).val(); 25 | $(ele).val(now.charAt(0)); 26 | excess = now.substr(1); 27 | }); 28 | 29 | // Move cursor to empty 30 | $digits.each((i, ele) => { 31 | if (!$(ele).val()) { 32 | $(ele).focus(); 33 | if (e.which == 8) { 34 | $(ele).prev().focus().val(""); 35 | } 36 | return false; 37 | } 38 | }); 39 | 40 | // Submit if last digit is filled 41 | if ($($digits[$digits.length - 1]).val()) { 42 | let token = $.map($digits, (d) => $(d).val()).join(""); 43 | let $value = $(input).parent().find("#login-token-value"); 44 | $value.val(token); 45 | $value.closest("form").submit(); 46 | } 47 | }; 48 | 49 | $digits = $(input).find("input"); 50 | $digits.on("keyup", update); 51 | $digits.on("change", update); 52 | $digits.on("input", update); 53 | }); 54 | -------------------------------------------------------------------------------- /assets/multi.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | let $select = $(".multi-select"); 4 | 5 | $select.on("change-files", (e, files) => { 6 | $(".multi-files-value").val(JSON.stringify(files.map((f) => f.name))); 7 | if (files.length == 0) { 8 | $(".multi-files").html( 9 | `
  • No files selected
  • ` 10 | ); 11 | return; 12 | } 13 | $(".multi-files").html( 14 | files 15 | .map((f) => { 16 | const badge = ` 17 | ${filesize(f.size)} 18 | `; 19 | return ` 20 |
  • 21 | ${htmlEscape(f.name)} 22 | ${f.type == "directory" ? `` : badge} 23 |
  • 24 | `; 25 | }) 26 | .join("") 27 | ); 28 | const hasDirectory = files.reduce( 29 | (a, f) => a || f.type == "directory", 30 | false 31 | ); 32 | const totalSize = files.map((f) => f.size).reduce((a, b) => a + b); 33 | if (hasDirectory) { 34 | $(".multi-files-total").val(""); 35 | } else { 36 | $(".multi-files-total").val(filesize(totalSize)); 37 | } 38 | }); 39 | 40 | const updateSelected = () => { 41 | let $selected = $(".multi-select:checked"); 42 | let files = []; 43 | $selected.each((i, ele) => { 44 | files.push({ 45 | name: $(ele).data("select"), 46 | type: $(ele).data("select-type"), 47 | size: $(ele).data("select-size"), 48 | }); 49 | }); 50 | 51 | $select.trigger("change-files", [files]); 52 | }; 53 | 54 | $select.on("change", updateSelected); 55 | updateSelected(); 56 | -------------------------------------------------------------------------------- /assets/navbar.css: -------------------------------------------------------------------------------- 1 | #navbar { 2 | overflow-x: auto; 3 | } 4 | .nav-link { 5 | white-space: nowrap; 6 | } 7 | -------------------------------------------------------------------------------- /assets/rename.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | const updateRenameValue = ($inputs, $value) => { 4 | let files = []; 5 | $inputs.each((i, ele) => { 6 | files.push({ 7 | original: $(ele).data("original"), 8 | new: $(ele).val(), 9 | }); 10 | }); 11 | $value.val(JSON.stringify(files)); 12 | }; 13 | 14 | $select.on("change-files", (e, files) => { 15 | if (files.length == 0) { 16 | $(".rename-files").html( 17 | `` 18 | ); 19 | return; 20 | } 21 | $(".rename-files").html( 22 | files 23 | .map((f) => { 24 | return ` 25 |
    26 | 29 | 34 |
    35 | `; 36 | }) 37 | .join("") 38 | ); 39 | $(".rename-files-input").on("keydown", (e) => { 40 | if (e.keyCode == 13) { 41 | e.preventDefault(); 42 | const $next = $(e.target).parent().nextAll().find("input")[0]; 43 | if ($next) { 44 | $next.focus(); 45 | if ($next.type == "text") { 46 | $next.select(); 47 | } 48 | } 49 | } 50 | }); 51 | $(".rename-files").each((i, ele) => { 52 | const $value = $(ele).parent().find(".rename-files-value"); 53 | const $inputs = $(ele) 54 | .find(".rename-files-input") 55 | .on("focus blur change", (e) => { 56 | updateRenameValue($inputs, $value); 57 | }); 58 | updateRenameValue($inputs, $value); 59 | }); 60 | }); 61 | 62 | updateSelected(); 63 | -------------------------------------------------------------------------------- /assets/shell.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | const $shell = $("#shell"); 4 | const $close = $("#shell-close"); 5 | 6 | if ($shell.length > 0) { 7 | const ws = new WebSocket( 8 | "ws" + 9 | (window.location.protocol === "https:" ? "s" : "") + 10 | "://" + 11 | window.location.host + 12 | "/websocket?path=" + 13 | encodeURIComponent($shell.data("path")) 14 | ); 15 | 16 | const term = new Terminal(); 17 | const attachAddon = new AttachAddon.AttachAddon(ws, { bidirectional: true }); 18 | term.loadAddon(attachAddon); 19 | const fitAddon = new FitAddon.FitAddon(); 20 | term.loadAddon(fitAddon); 21 | term.open($shell[0]); 22 | 23 | ws.addEventListener("open", () => { 24 | // resize 25 | term.onResize(({ cols, rows }) => { 26 | console.debug(cols, rows); 27 | const buf = Uint16Array.of(0, cols, rows); 28 | ws.send(buf); 29 | }); 30 | $(window).on("resize", () => { 31 | fitAddon.fit(); 32 | }); 33 | fitAddon.fit(); 34 | 35 | // close 36 | let closeTimeout = null; 37 | $close.on("click", (e) => { 38 | e.preventDefault(); 39 | if (ws.readyState !== 1) { 40 | window.location.pathname = window.location.pathname.replace( 41 | "@shell", 42 | "" 43 | ); 44 | } else { 45 | ws.close(); 46 | } 47 | }); 48 | ws.addEventListener("close", () => { 49 | term.write("\r\n\r\nclosing shell in 2 seconds..."); 50 | closeTimeout = setTimeout(() => { 51 | window.location.pathname = window.location.pathname.replace( 52 | "@shell", 53 | "" 54 | ); 55 | }, 2000); 56 | }); 57 | term.onData(() => { 58 | if (closeTimeout != null) { 59 | clearTimeout(closeTimeout); 60 | term.write("\r\nkeyboard input detected. timeout canceled"); 61 | closeTimeout = null; 62 | } 63 | }); 64 | }); 65 | } 66 | -------------------------------------------------------------------------------- /assets/tooltip.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | document.querySelectorAll("[title]").forEach((element) => { 4 | new bootstrap.Tooltip(element, { 5 | delay: 500, 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /assets/upload.css: -------------------------------------------------------------------------------- 1 | .custom-file-label { 2 | white-space: nowrap; 3 | text-overflow: ellipsis; 4 | overflow: hidden; 5 | padding-right: 5.4em; 6 | } 7 | -------------------------------------------------------------------------------- /assets/upload.js: -------------------------------------------------------------------------------- 1 | /* jshint esversion: 6 */ 2 | 3 | const $form = $("form[action='@upload']"); 4 | const $file = $("#upload-file"); 5 | 6 | $(".upload-unhide").fadeOut(); 7 | 8 | $file.on("change", () => { 9 | const file = $file[0].files[0]; 10 | const fnElement = $file.parent().find(".custom-file-label"); 11 | fnElement.addClass("file-selected"); 12 | fnElement.text(file.name); 13 | 14 | $form.find("#upload-file-size").val(filesize(file.size)); 15 | $form.find("[name=saveas]").val(file.name); 16 | $(".upload-unhide").fadeIn(); 17 | }); 18 | 19 | $form.on("submit", () => { 20 | let putresource = $form.find("[name=saveas]").val(); 21 | // TODO: do XHR to PUT at putresource 22 | }); 23 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /* jshint esversion: 6 */ 4 | /* jshint node: true */ 5 | "use strict"; 6 | 7 | const express = require("express"); 8 | const { engine: hbs } = require("express-handlebars"); 9 | const session = require("express-session"); 10 | const busboy = require("connect-busboy"); 11 | const flash = require("connect-flash"); 12 | const querystring = require("querystring"); 13 | const assets = require("./assets"); 14 | const archiver = require("archiver"); 15 | 16 | const notp = require("notp"); 17 | const base32 = require("thirty-two"); 18 | 19 | const fs = require("fs"); 20 | const rimraf = require("rimraf"); 21 | const path = require("path"); 22 | 23 | const filesize = require("filesize"); 24 | const octicons = require("@primer/octicons"); 25 | const handlebars = require("handlebars"); 26 | 27 | const port = +process.env.PORT || 8080; 28 | 29 | const app = express(); 30 | const http = app.listen(port); 31 | 32 | app.set("views", path.join(__dirname, "views")); 33 | app.engine( 34 | "handlebars", 35 | hbs({ 36 | partialsDir: path.join(__dirname, "views", "partials"), 37 | layoutsDir: path.join(__dirname, "views", "layouts"), 38 | defaultLayout: "main", 39 | helpers: { 40 | either: function (a, b, options) { 41 | if (a || b) { 42 | return options.fn(this); 43 | } 44 | }, 45 | filesize: filesize, 46 | octicon: function (i, options) { 47 | if (!octicons[i]) { 48 | return new handlebars.SafeString(octicons.question.toSVG()); 49 | } 50 | return new handlebars.SafeString(octicons[i].toSVG()); 51 | }, 52 | eachpath: function (path, options) { 53 | if (typeof path != "string") { 54 | return ""; 55 | } 56 | let out = ""; 57 | path = path.split("/"); 58 | path.splice(path.length - 1, 1); 59 | path.unshift(""); 60 | path.forEach((folder, index) => { 61 | out += options.fn({ 62 | name: folder + "/", 63 | path: "/" + path.slice(1, index + 1).join("/"), 64 | current: index === path.length - 1, 65 | }); 66 | }); 67 | return out; 68 | }, 69 | }, 70 | }) 71 | ); 72 | app.set("view engine", "handlebars"); 73 | 74 | app.use("/@assets", express.static(path.join(__dirname, "assets"))); 75 | // init assets 76 | assets.forEach((asset) => { 77 | const { path: url, modulePath } = asset; 78 | app.use( 79 | `/@assets/${url}`, 80 | express.static(path.join(__dirname, `node_modules/${modulePath}`)) 81 | ); 82 | }); 83 | 84 | app.use( 85 | session({ 86 | secret: process.env.SESSION_KEY || "meowmeow", 87 | resave: false, 88 | saveUninitialized: false, 89 | }) 90 | ); 91 | app.use(flash()); 92 | app.use(busboy()); 93 | app.use( 94 | express.urlencoded({ 95 | extended: false, 96 | }) 97 | ); 98 | // AUTH 99 | 100 | const KEY = process.env.KEY 101 | ? base32.decode(process.env.KEY.replace(/ /g, "")) 102 | : null; 103 | 104 | app.get("/@logout", (req, res) => { 105 | if (KEY) { 106 | req.session.login = false; 107 | req.flash("success", "Signed out."); 108 | res.redirect("/@login"); 109 | return; 110 | } 111 | req.flash("error", "You were never logged in..."); 112 | res.redirect("back"); 113 | }); 114 | 115 | app.get("/@login", (req, res) => { 116 | res.render("login", flashify(req, {})); 117 | }); 118 | app.post("/@login", (req, res) => { 119 | let pass = notp.totp.verify(req.body.token.replace(" ", ""), KEY); 120 | if (pass) { 121 | req.session.login = true; 122 | res.redirect("/"); 123 | return; 124 | } 125 | req.flash("error", "Bad token."); 126 | res.redirect("/@login"); 127 | }); 128 | 129 | app.use((req, res, next) => { 130 | if (!KEY) { 131 | return next(); 132 | } 133 | if (req.session.login === true) { 134 | return next(); 135 | } 136 | req.flash("error", "Please sign in."); 137 | res.redirect("/@login"); 138 | }); 139 | 140 | function relative(...paths) { 141 | const finalPath = paths.reduce((a, b) => path.join(a, b), process.cwd()); 142 | if (path.relative(process.cwd(), finalPath).startsWith("..")) { 143 | throw new Error("Failed to resolve path outside of the working directory"); 144 | } 145 | return finalPath; 146 | } 147 | function flashify(req, obj) { 148 | let error = req.flash("error"); 149 | if (error && error.length > 0) { 150 | if (!obj.errors) { 151 | obj.errors = []; 152 | } 153 | obj.errors.push(error); 154 | } 155 | let success = req.flash("success"); 156 | if (success && success.length > 0) { 157 | if (!obj.successes) { 158 | obj.successes = []; 159 | } 160 | obj.successes.push(success); 161 | } 162 | obj.isloginenabled = !!KEY; 163 | return obj; 164 | } 165 | 166 | app.use((req, res, next) => { 167 | if (req.method === "GET") { 168 | return next(); 169 | } 170 | let sourceHost = null; 171 | if (req.headers.origin) { 172 | sourceHost = new URL(req.headers.origin).host; 173 | } else if (req.headers.referer) { 174 | sourceHost = new URL(req.headers.referer).host; 175 | } 176 | if (sourceHost !== req.headers.host) { 177 | throw new Error( 178 | "Origin or Referer header does not match or is missing. Request has been blocked to prevent CSRF" 179 | ); 180 | } 181 | next(); 182 | }); 183 | 184 | app.all("/*", (req, res, next) => { 185 | res.filename = req.params[0]; 186 | 187 | let fileExists = new Promise((resolve, reject) => { 188 | // check if file exists 189 | fs.stat(relative(res.filename), (err, stats) => { 190 | if (err) { 191 | return reject(err); 192 | } 193 | return resolve(stats); 194 | }); 195 | }); 196 | 197 | fileExists 198 | .then((stats) => { 199 | res.stats = stats; 200 | next(); 201 | }) 202 | .catch((err) => { 203 | res.stats = { error: err }; 204 | next(); 205 | }); 206 | }); 207 | 208 | app.post("/*@upload", (req, res) => { 209 | res.filename = req.params[0]; 210 | 211 | let buff = null; 212 | let saveas = null; 213 | req.busboy.on("file", (key, stream, filename) => { 214 | if (key == "file") { 215 | let buffs = []; 216 | stream.on("data", (d) => { 217 | buffs.push(d); 218 | }); 219 | stream.on("end", () => { 220 | buff = Buffer.concat(buffs); 221 | buffs = null; 222 | }); 223 | } 224 | }); 225 | req.busboy.on("field", (key, value) => { 226 | if (key == "saveas") { 227 | saveas = value; 228 | } 229 | }); 230 | req.busboy.on("finish", () => { 231 | if (!buff || !saveas) { 232 | return res.status(400).end(); 233 | } 234 | let fileExists = new Promise((resolve, reject) => { 235 | // check if file exists 236 | fs.stat(relative(res.filename, saveas), (err, stats) => { 237 | if (err) { 238 | return reject(err); 239 | } 240 | return resolve(stats); 241 | }); 242 | }); 243 | 244 | fileExists 245 | .then((stats) => { 246 | console.warn("file exists, cannot overwrite"); 247 | req.flash("error", "File exists, cannot overwrite. "); 248 | res.redirect("back"); 249 | }) 250 | .catch((err) => { 251 | const saveName = relative(res.filename, saveas); 252 | console.log("saving file to " + saveName); 253 | let save = fs.createWriteStream(saveName); 254 | save.on("close", () => { 255 | if (res.headersSent) { 256 | return; 257 | } 258 | if (buff.length === 0) { 259 | req.flash("success", "File saved. Warning: empty file."); 260 | } else { 261 | buff = null; 262 | req.flash("success", "File saved. "); 263 | } 264 | res.redirect("back"); 265 | }); 266 | save.on("error", (err) => { 267 | console.warn(err); 268 | req.flash("error", err.toString()); 269 | res.redirect("back"); 270 | }); 271 | save.write(buff); 272 | save.end(); 273 | }); 274 | }); 275 | req.pipe(req.busboy); 276 | }); 277 | 278 | app.post("/*@mkdir", (req, res) => { 279 | res.filename = req.params[0]; 280 | 281 | let folder = req.body.folder; 282 | if (!folder || folder.length < 1) { 283 | return res.status(400).end(); 284 | } 285 | 286 | let fileExists = new Promise((resolve, reject) => { 287 | // Check if file exists 288 | fs.stat(relative(res.filename, folder), (err, stats) => { 289 | if (err) { 290 | return reject(err); 291 | } 292 | return resolve(stats); 293 | }); 294 | }); 295 | 296 | fileExists 297 | .then((stats) => { 298 | req.flash("error", "Folder exists, cannot overwrite. "); 299 | res.redirect("back"); 300 | }) 301 | .catch((err) => { 302 | fs.mkdir(relative(res.filename, folder), (err) => { 303 | if (err) { 304 | console.warn(err); 305 | req.flash("error", err.toString()); 306 | res.redirect("back"); 307 | return; 308 | } 309 | req.flash("success", "Folder created. "); 310 | res.redirect("back"); 311 | }); 312 | }); 313 | }); 314 | 315 | app.post("/*@delete", (req, res) => { 316 | res.filename = req.params[0]; 317 | 318 | let files = JSON.parse(req.body.files); 319 | if (!files || !files.map) { 320 | req.flash("error", "No files selected."); 321 | res.redirect("back"); 322 | return; // res.status(400).end(); 323 | } 324 | 325 | let promises = files.map((f) => { 326 | return new Promise((resolve, reject) => { 327 | fs.stat(relative(res.filename, f), (err, stats) => { 328 | if (err) { 329 | return reject(err); 330 | } 331 | resolve({ 332 | name: f, 333 | isdirectory: stats.isDirectory(), 334 | isfile: stats.isFile(), 335 | }); 336 | }); 337 | }); 338 | }); 339 | Promise.all(promises) 340 | .then((files) => { 341 | let promises = files.map((f) => { 342 | return new Promise((resolve, reject) => { 343 | let op = null; 344 | if (f.isdirectory) { 345 | op = (dir, cb) => 346 | rimraf( 347 | dir, 348 | { 349 | glob: false, 350 | }, 351 | cb 352 | ); 353 | } else if (f.isfile) { 354 | op = fs.unlink; 355 | } 356 | if (op) { 357 | op(relative(res.filename, f.name), (err) => { 358 | if (err) { 359 | return reject(err); 360 | } 361 | resolve(); 362 | }); 363 | } 364 | }); 365 | }); 366 | Promise.all(promises) 367 | .then(() => { 368 | req.flash("success", "Files deleted. "); 369 | res.redirect("back"); 370 | }) 371 | .catch((err) => { 372 | console.warn(err); 373 | req.flash("error", "Unable to delete some files: " + err); 374 | res.redirect("back"); 375 | }); 376 | }) 377 | .catch((err) => { 378 | console.warn(err); 379 | req.flash("error", err.toString()); 380 | res.redirect("back"); 381 | }); 382 | }); 383 | 384 | app.get("/*@download", (req, res) => { 385 | res.filename = req.params[0]; 386 | 387 | let files = null; 388 | try { 389 | files = JSON.parse(req.query.files); 390 | } catch (e) {} 391 | if (!files || !files.map) { 392 | req.flash("error", "No files selected."); 393 | res.redirect("back"); 394 | return; // res.status(400).end(); 395 | } 396 | 397 | let promises = files.map((f) => { 398 | return new Promise((resolve, reject) => { 399 | fs.stat(relative(res.filename, f), (err, stats) => { 400 | if (err) { 401 | return reject(err); 402 | } 403 | resolve({ 404 | name: f, 405 | isdirectory: stats.isDirectory(), 406 | isfile: stats.isFile(), 407 | }); 408 | }); 409 | }); 410 | }); 411 | Promise.all(promises) 412 | .then((files) => { 413 | let zip = archiver("zip", {}); 414 | zip.on("error", function (err) { 415 | console.warn(err); 416 | res.status(500).send({ 417 | error: err.message, 418 | }); 419 | }); 420 | 421 | files 422 | .filter((f) => f.isfile) 423 | .forEach((f) => { 424 | zip.file(relative(res.filename, f.name), { name: f.name }); 425 | }); 426 | files 427 | .filter((f) => f.isdirectory) 428 | .forEach((f) => { 429 | zip.directory(relative(res.filename, f.name), f.name); 430 | }); 431 | 432 | res.attachment("Archive.zip"); 433 | zip.pipe(res); 434 | 435 | zip.finalize(); 436 | }) 437 | .catch((err) => { 438 | console.warn(err); 439 | req.flash("error", err.toString()); 440 | res.redirect("back"); 441 | }); 442 | }); 443 | 444 | app.post("/*@rename", (req, res) => { 445 | res.filename = req.params[0]; 446 | 447 | let files = JSON.parse(req.body.files); 448 | if (!files || !files.map) { 449 | req.flash("error", "No files selected."); 450 | res.redirect("back"); 451 | return; 452 | } 453 | 454 | new Promise((resolve, reject) => { 455 | fs.access(relative(res.filename), fs.constants.W_OK, (err) => { 456 | if (err) { 457 | return reject(err); 458 | } 459 | resolve(); 460 | }); 461 | }) 462 | .then(() => { 463 | let promises = files.map((f) => { 464 | return new Promise((resolve, reject) => { 465 | fs.rename( 466 | relative(res.filename, f.original), 467 | relative(res.filename, f.new), 468 | (err) => { 469 | if (err) { 470 | return reject(err); 471 | } 472 | resolve(); 473 | } 474 | ); 475 | }); 476 | }); 477 | Promise.all(promises) 478 | .then(() => { 479 | req.flash("success", "Files renamed. "); 480 | res.redirect("back"); 481 | }) 482 | .catch((err) => { 483 | console.warn(err); 484 | req.flash("error", "Unable to rename some files: " + err); 485 | res.redirect("back"); 486 | }); 487 | }) 488 | .catch((err) => { 489 | console.warn(err); 490 | req.flash("error", err.toString()); 491 | res.redirect("back"); 492 | }); 493 | }); 494 | 495 | const shellable = process.env.SHELL != "false" && process.env.SHELL; 496 | const cmdable = process.env.CMD != "false" && process.env.CMD; 497 | if (shellable || cmdable) { 498 | const shellArgs = process.env.SHELL.split(" "); 499 | const exec = process.env.SHELL == "login" ? "/usr/bin/env" : shellArgs[0]; 500 | const args = process.env.SHELL == "login" ? ["login"] : shellArgs.slice(1); 501 | 502 | const child_process = require("child_process"); 503 | 504 | app.post("/*@cmd", (req, res) => { 505 | res.filename = req.params[0]; 506 | 507 | let cmd = req.body.cmd; 508 | if (!cmd || cmd.length < 1) { 509 | return res.status(400).end(); 510 | } 511 | console.log("running command " + cmd); 512 | 513 | child_process.exec( 514 | cmd, 515 | { 516 | cwd: relative(res.filename), 517 | timeout: 60 * 1000, 518 | }, 519 | (err, stdout, stderr) => { 520 | if (err) { 521 | console.log("command run failed: " + JSON.stringify(err)); 522 | req.flash("error", "Command failed due to non-zero exit code"); 523 | } 524 | res.render( 525 | "cmd", 526 | flashify(req, { 527 | path: res.filename, 528 | cmd: cmd, 529 | stdout: stdout, 530 | stderr: stderr, 531 | }) 532 | ); 533 | } 534 | ); 535 | }); 536 | 537 | const pty = require("node-pty"); 538 | const WebSocket = require("ws"); 539 | 540 | app.get("/*@shell", (req, res) => { 541 | res.filename = req.params[0]; 542 | 543 | res.render( 544 | "shell", 545 | flashify(req, { 546 | path: res.filename, 547 | }) 548 | ); 549 | }); 550 | 551 | const ws = new WebSocket.Server({ server: http }); 552 | ws.on("connection", (socket, request) => { 553 | const { path } = querystring.parse(request.url.split("?")[1]); 554 | let cwd = relative(path); 555 | let term = pty.spawn(exec, args, { 556 | name: "xterm-256color", 557 | cols: 80, 558 | rows: 30, 559 | cwd: cwd, 560 | }); 561 | console.log( 562 | "pid " + term.pid + " shell " + process.env.SHELL + " started in " + cwd 563 | ); 564 | 565 | term.on("data", (data) => { 566 | socket.send(data, { binary: true }); 567 | }); 568 | term.on("exit", (code) => { 569 | console.log("pid " + term.pid + " ended"); 570 | socket.close(); 571 | }); 572 | socket.on("message", (data) => { 573 | // special messages should decode to Buffers 574 | if (data.length == 6) { 575 | switch (data.readUInt16BE(0)) { 576 | case 0: 577 | term.resize(data.readUInt16BE(1), data.readUInt16BE(2)); 578 | return; 579 | } 580 | } 581 | term.write(data); 582 | }); 583 | socket.on("close", () => { 584 | term.end(); 585 | }); 586 | }); 587 | } 588 | 589 | const SMALL_IMAGE_MAX_SIZE = 750 * 1024; // 750 KB 590 | const EXT_IMAGES = [".jpg", ".jpeg", ".png", ".webp", ".svg", ".gif", ".tiff"]; 591 | function isimage(f) { 592 | for (const ext of EXT_IMAGES) { 593 | if (f.endsWith(ext)) { 594 | return true; 595 | } 596 | } 597 | return false; 598 | } 599 | 600 | app.get("/*", (req, res) => { 601 | if (res.stats.error) { 602 | res.render( 603 | "list", 604 | flashify(req, { 605 | shellable: shellable, 606 | cmdable: cmdable, 607 | path: res.filename, 608 | errors: [res.stats.error], 609 | }) 610 | ); 611 | } else if (res.stats.isDirectory()) { 612 | if (!req.url.endsWith("/")) { 613 | return res.redirect(req.url + "/"); 614 | } 615 | 616 | let readDir = new Promise((resolve, reject) => { 617 | fs.readdir(relative(res.filename), (err, filenames) => { 618 | if (err) { 619 | return reject(err); 620 | } 621 | return resolve(filenames); 622 | }); 623 | }); 624 | 625 | readDir 626 | .then((filenames) => { 627 | const promises = filenames.map( 628 | (f) => 629 | new Promise((resolve, reject) => { 630 | fs.stat(relative(res.filename, f), (err, stats) => { 631 | if (err) { 632 | console.warn(err); 633 | return resolve({ 634 | name: f, 635 | error: err, 636 | }); 637 | } 638 | resolve({ 639 | name: f, 640 | isdirectory: stats.isDirectory(), 641 | issmallimage: isimage(f) && stats.size < SMALL_IMAGE_MAX_SIZE, 642 | size: stats.size, 643 | }); 644 | }); 645 | }) 646 | ); 647 | 648 | Promise.all(promises) 649 | .then((files) => { 650 | res.render( 651 | "list", 652 | flashify(req, { 653 | shellable: shellable, 654 | cmdable: cmdable, 655 | path: res.filename, 656 | files: files, 657 | }) 658 | ); 659 | }) 660 | .catch((err) => { 661 | console.error(err); 662 | res.render( 663 | "list", 664 | flashify(req, { 665 | shellable: shellable, 666 | cmdable: cmdable, 667 | path: res.filename, 668 | errors: [err], 669 | }) 670 | ); 671 | }); 672 | }) 673 | .catch((err) => { 674 | console.warn(err); 675 | res.render( 676 | "list", 677 | flashify(req, { 678 | shellable: shellable, 679 | cmdable: cmdable, 680 | path: res.filename, 681 | errors: [err], 682 | }) 683 | ); 684 | }); 685 | } else if (res.stats.isFile()) { 686 | res.sendFile(relative(res.filename), { 687 | headers: { 688 | "Content-Security-Policy": 689 | "default-src 'self'; script-src 'none'; sandbox", 690 | }, 691 | dotfiles: "allow", 692 | }); 693 | } 694 | }); 695 | 696 | console.log(`Listening on port ${port}`); 697 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "file-manager", 3 | "version": "0.2.4", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "file-manager", 9 | "version": "0.2.4", 10 | "dependencies": { 11 | "@primer/octicons": "^16.1.1", 12 | "archiver": "^5.3.0", 13 | "bootstrap": "^5.0.0", 14 | "connect-busboy": "^0.0.2", 15 | "connect-flash": "^0.1.1", 16 | "express": "^4.19.2", 17 | "express-handlebars": "^6.0.1", 18 | "express-session": "^1.17.2", 19 | "filesize": "^8.0.6", 20 | "jquery": "^3.6.0", 21 | "node-pty": "^0.10.1", 22 | "notp": "^2.0.3", 23 | "rimraf": "^3.0.2", 24 | "thirty-two": "^1.0.2", 25 | "ws": "^8.5.0", 26 | "xterm": "^4.15.0", 27 | "xterm-addon-attach": "^0.6.0", 28 | "xterm-addon-fit": "^0.5.0" 29 | }, 30 | "bin": { 31 | "file-manager": "index.js" 32 | }, 33 | "devDependencies": { 34 | "nodemon": "^2.0.20", 35 | "prettier": "^2.4.1" 36 | } 37 | }, 38 | "node_modules/@popperjs/core": { 39 | "version": "2.10.2", 40 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz", 41 | "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==", 42 | "peer": true, 43 | "funding": { 44 | "type": "opencollective", 45 | "url": "https://opencollective.com/popperjs" 46 | } 47 | }, 48 | "node_modules/@primer/octicons": { 49 | "version": "16.1.1", 50 | "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-16.1.1.tgz", 51 | "integrity": "sha512-qlMErXg4I7oOofP4d5GceLbNpjTRSkyLoe5Ng1mfebtTvjeBj8x+kdqgwFWLRp7QO1ye5AaxcCvn1AJMAeURzw==", 52 | "dependencies": { 53 | "object-assign": "^4.1.1" 54 | } 55 | }, 56 | "node_modules/abbrev": { 57 | "version": "1.1.1", 58 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 59 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 60 | "dev": true 61 | }, 62 | "node_modules/accepts": { 63 | "version": "1.3.8", 64 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 65 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 66 | "dependencies": { 67 | "mime-types": "~2.1.34", 68 | "negotiator": "0.6.3" 69 | }, 70 | "engines": { 71 | "node": ">= 0.6" 72 | } 73 | }, 74 | "node_modules/anymatch": { 75 | "version": "3.1.2", 76 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 77 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 78 | "dev": true, 79 | "dependencies": { 80 | "normalize-path": "^3.0.0", 81 | "picomatch": "^2.0.4" 82 | }, 83 | "engines": { 84 | "node": ">= 8" 85 | } 86 | }, 87 | "node_modules/archiver": { 88 | "version": "5.3.0", 89 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", 90 | "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", 91 | "dependencies": { 92 | "archiver-utils": "^2.1.0", 93 | "async": "^3.2.0", 94 | "buffer-crc32": "^0.2.1", 95 | "readable-stream": "^3.6.0", 96 | "readdir-glob": "^1.0.0", 97 | "tar-stream": "^2.2.0", 98 | "zip-stream": "^4.1.0" 99 | }, 100 | "engines": { 101 | "node": ">= 10" 102 | } 103 | }, 104 | "node_modules/archiver-utils": { 105 | "version": "2.1.0", 106 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", 107 | "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", 108 | "dependencies": { 109 | "glob": "^7.1.4", 110 | "graceful-fs": "^4.2.0", 111 | "lazystream": "^1.0.0", 112 | "lodash.defaults": "^4.2.0", 113 | "lodash.difference": "^4.5.0", 114 | "lodash.flatten": "^4.4.0", 115 | "lodash.isplainobject": "^4.0.6", 116 | "lodash.union": "^4.6.0", 117 | "normalize-path": "^3.0.0", 118 | "readable-stream": "^2.0.0" 119 | }, 120 | "engines": { 121 | "node": ">= 6" 122 | } 123 | }, 124 | "node_modules/archiver-utils/node_modules/readable-stream": { 125 | "version": "2.3.7", 126 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 127 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 128 | "dependencies": { 129 | "core-util-is": "~1.0.0", 130 | "inherits": "~2.0.3", 131 | "isarray": "~1.0.0", 132 | "process-nextick-args": "~2.0.0", 133 | "safe-buffer": "~5.1.1", 134 | "string_decoder": "~1.1.1", 135 | "util-deprecate": "~1.0.1" 136 | } 137 | }, 138 | "node_modules/archiver-utils/node_modules/string_decoder": { 139 | "version": "1.1.1", 140 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 141 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 142 | "dependencies": { 143 | "safe-buffer": "~5.1.0" 144 | } 145 | }, 146 | "node_modules/array-flatten": { 147 | "version": "1.1.1", 148 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 149 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 150 | }, 151 | "node_modules/async": { 152 | "version": "3.2.2", 153 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", 154 | "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" 155 | }, 156 | "node_modules/balanced-match": { 157 | "version": "1.0.2", 158 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 159 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 160 | }, 161 | "node_modules/base64-js": { 162 | "version": "1.5.1", 163 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 164 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 165 | "funding": [ 166 | { 167 | "type": "github", 168 | "url": "https://github.com/sponsors/feross" 169 | }, 170 | { 171 | "type": "patreon", 172 | "url": "https://www.patreon.com/feross" 173 | }, 174 | { 175 | "type": "consulting", 176 | "url": "https://feross.org/support" 177 | } 178 | ] 179 | }, 180 | "node_modules/binary-extensions": { 181 | "version": "2.2.0", 182 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 183 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 184 | "dev": true, 185 | "engines": { 186 | "node": ">=8" 187 | } 188 | }, 189 | "node_modules/bl": { 190 | "version": "4.1.0", 191 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 192 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 193 | "dependencies": { 194 | "buffer": "^5.5.0", 195 | "inherits": "^2.0.4", 196 | "readable-stream": "^3.4.0" 197 | } 198 | }, 199 | "node_modules/body-parser": { 200 | "version": "1.20.2", 201 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 202 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 203 | "dependencies": { 204 | "bytes": "3.1.2", 205 | "content-type": "~1.0.5", 206 | "debug": "2.6.9", 207 | "depd": "2.0.0", 208 | "destroy": "1.2.0", 209 | "http-errors": "2.0.0", 210 | "iconv-lite": "0.4.24", 211 | "on-finished": "2.4.1", 212 | "qs": "6.11.0", 213 | "raw-body": "2.5.2", 214 | "type-is": "~1.6.18", 215 | "unpipe": "1.0.0" 216 | }, 217 | "engines": { 218 | "node": ">= 0.8", 219 | "npm": "1.2.8000 || >= 1.4.16" 220 | } 221 | }, 222 | "node_modules/bootstrap": { 223 | "version": "5.1.3", 224 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", 225 | "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", 226 | "funding": { 227 | "type": "opencollective", 228 | "url": "https://opencollective.com/bootstrap" 229 | }, 230 | "peerDependencies": { 231 | "@popperjs/core": "^2.10.2" 232 | } 233 | }, 234 | "node_modules/brace-expansion": { 235 | "version": "1.1.11", 236 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 237 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 238 | "dependencies": { 239 | "balanced-match": "^1.0.0", 240 | "concat-map": "0.0.1" 241 | } 242 | }, 243 | "node_modules/braces": { 244 | "version": "3.0.2", 245 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 246 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 247 | "dev": true, 248 | "dependencies": { 249 | "fill-range": "^7.0.1" 250 | }, 251 | "engines": { 252 | "node": ">=8" 253 | } 254 | }, 255 | "node_modules/buffer": { 256 | "version": "5.7.1", 257 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 258 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 259 | "funding": [ 260 | { 261 | "type": "github", 262 | "url": "https://github.com/sponsors/feross" 263 | }, 264 | { 265 | "type": "patreon", 266 | "url": "https://www.patreon.com/feross" 267 | }, 268 | { 269 | "type": "consulting", 270 | "url": "https://feross.org/support" 271 | } 272 | ], 273 | "dependencies": { 274 | "base64-js": "^1.3.1", 275 | "ieee754": "^1.1.13" 276 | } 277 | }, 278 | "node_modules/buffer-crc32": { 279 | "version": "0.2.13", 280 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 281 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 282 | "engines": { 283 | "node": "*" 284 | } 285 | }, 286 | "node_modules/busboy": { 287 | "version": "0.3.1", 288 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", 289 | "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", 290 | "dependencies": { 291 | "dicer": "0.3.0" 292 | }, 293 | "engines": { 294 | "node": ">=4.5.0" 295 | } 296 | }, 297 | "node_modules/bytes": { 298 | "version": "3.1.2", 299 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 300 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 301 | "engines": { 302 | "node": ">= 0.8" 303 | } 304 | }, 305 | "node_modules/call-bind": { 306 | "version": "1.0.7", 307 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 308 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 309 | "dependencies": { 310 | "es-define-property": "^1.0.0", 311 | "es-errors": "^1.3.0", 312 | "function-bind": "^1.1.2", 313 | "get-intrinsic": "^1.2.4", 314 | "set-function-length": "^1.2.1" 315 | }, 316 | "engines": { 317 | "node": ">= 0.4" 318 | }, 319 | "funding": { 320 | "url": "https://github.com/sponsors/ljharb" 321 | } 322 | }, 323 | "node_modules/chokidar": { 324 | "version": "3.5.3", 325 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 326 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 327 | "dev": true, 328 | "funding": [ 329 | { 330 | "type": "individual", 331 | "url": "https://paulmillr.com/funding/" 332 | } 333 | ], 334 | "dependencies": { 335 | "anymatch": "~3.1.2", 336 | "braces": "~3.0.2", 337 | "glob-parent": "~5.1.2", 338 | "is-binary-path": "~2.1.0", 339 | "is-glob": "~4.0.1", 340 | "normalize-path": "~3.0.0", 341 | "readdirp": "~3.6.0" 342 | }, 343 | "engines": { 344 | "node": ">= 8.10.0" 345 | }, 346 | "optionalDependencies": { 347 | "fsevents": "~2.3.2" 348 | } 349 | }, 350 | "node_modules/compress-commons": { 351 | "version": "4.1.1", 352 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", 353 | "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", 354 | "dependencies": { 355 | "buffer-crc32": "^0.2.13", 356 | "crc32-stream": "^4.0.2", 357 | "normalize-path": "^3.0.0", 358 | "readable-stream": "^3.6.0" 359 | }, 360 | "engines": { 361 | "node": ">= 10" 362 | } 363 | }, 364 | "node_modules/concat-map": { 365 | "version": "0.0.1", 366 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 367 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 368 | }, 369 | "node_modules/connect-busboy": { 370 | "version": "0.0.2", 371 | "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", 372 | "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", 373 | "dependencies": { 374 | "busboy": "*" 375 | }, 376 | "engines": { 377 | "node": ">=0.8.0" 378 | } 379 | }, 380 | "node_modules/connect-flash": { 381 | "version": "0.1.1", 382 | "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", 383 | "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=", 384 | "engines": { 385 | "node": ">= 0.4.0" 386 | } 387 | }, 388 | "node_modules/content-disposition": { 389 | "version": "0.5.4", 390 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 391 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 392 | "dependencies": { 393 | "safe-buffer": "5.2.1" 394 | }, 395 | "engines": { 396 | "node": ">= 0.6" 397 | } 398 | }, 399 | "node_modules/content-disposition/node_modules/safe-buffer": { 400 | "version": "5.2.1", 401 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 402 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 403 | "funding": [ 404 | { 405 | "type": "github", 406 | "url": "https://github.com/sponsors/feross" 407 | }, 408 | { 409 | "type": "patreon", 410 | "url": "https://www.patreon.com/feross" 411 | }, 412 | { 413 | "type": "consulting", 414 | "url": "https://feross.org/support" 415 | } 416 | ] 417 | }, 418 | "node_modules/content-type": { 419 | "version": "1.0.5", 420 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 421 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 422 | "engines": { 423 | "node": ">= 0.6" 424 | } 425 | }, 426 | "node_modules/cookie": { 427 | "version": "0.6.0", 428 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 429 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 430 | "engines": { 431 | "node": ">= 0.6" 432 | } 433 | }, 434 | "node_modules/cookie-signature": { 435 | "version": "1.0.6", 436 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 437 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 438 | }, 439 | "node_modules/core-util-is": { 440 | "version": "1.0.3", 441 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 442 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 443 | }, 444 | "node_modules/crc-32": { 445 | "version": "1.2.0", 446 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", 447 | "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", 448 | "dependencies": { 449 | "exit-on-epipe": "~1.0.1", 450 | "printj": "~1.1.0" 451 | }, 452 | "bin": { 453 | "crc32": "bin/crc32.njs" 454 | }, 455 | "engines": { 456 | "node": ">=0.8" 457 | } 458 | }, 459 | "node_modules/crc32-stream": { 460 | "version": "4.0.2", 461 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", 462 | "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", 463 | "dependencies": { 464 | "crc-32": "^1.2.0", 465 | "readable-stream": "^3.4.0" 466 | }, 467 | "engines": { 468 | "node": ">= 10" 469 | } 470 | }, 471 | "node_modules/debug": { 472 | "version": "2.6.9", 473 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 474 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 475 | "dependencies": { 476 | "ms": "2.0.0" 477 | } 478 | }, 479 | "node_modules/define-data-property": { 480 | "version": "1.1.4", 481 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 482 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 483 | "dependencies": { 484 | "es-define-property": "^1.0.0", 485 | "es-errors": "^1.3.0", 486 | "gopd": "^1.0.1" 487 | }, 488 | "engines": { 489 | "node": ">= 0.4" 490 | }, 491 | "funding": { 492 | "url": "https://github.com/sponsors/ljharb" 493 | } 494 | }, 495 | "node_modules/depd": { 496 | "version": "2.0.0", 497 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 498 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 499 | "engines": { 500 | "node": ">= 0.8" 501 | } 502 | }, 503 | "node_modules/destroy": { 504 | "version": "1.2.0", 505 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 506 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 507 | "engines": { 508 | "node": ">= 0.8", 509 | "npm": "1.2.8000 || >= 1.4.16" 510 | } 511 | }, 512 | "node_modules/dicer": { 513 | "version": "0.3.0", 514 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 515 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 516 | "dependencies": { 517 | "streamsearch": "0.1.2" 518 | }, 519 | "engines": { 520 | "node": ">=4.5.0" 521 | } 522 | }, 523 | "node_modules/ee-first": { 524 | "version": "1.1.1", 525 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 526 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 527 | }, 528 | "node_modules/encodeurl": { 529 | "version": "1.0.2", 530 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 531 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 532 | "engines": { 533 | "node": ">= 0.8" 534 | } 535 | }, 536 | "node_modules/end-of-stream": { 537 | "version": "1.4.4", 538 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 539 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 540 | "dependencies": { 541 | "once": "^1.4.0" 542 | } 543 | }, 544 | "node_modules/es-define-property": { 545 | "version": "1.0.0", 546 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 547 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 548 | "dependencies": { 549 | "get-intrinsic": "^1.2.4" 550 | }, 551 | "engines": { 552 | "node": ">= 0.4" 553 | } 554 | }, 555 | "node_modules/es-errors": { 556 | "version": "1.3.0", 557 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 558 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 559 | "engines": { 560 | "node": ">= 0.4" 561 | } 562 | }, 563 | "node_modules/escape-html": { 564 | "version": "1.0.3", 565 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 566 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 567 | }, 568 | "node_modules/etag": { 569 | "version": "1.8.1", 570 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 571 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 572 | "engines": { 573 | "node": ">= 0.6" 574 | } 575 | }, 576 | "node_modules/exit-on-epipe": { 577 | "version": "1.0.1", 578 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", 579 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", 580 | "engines": { 581 | "node": ">=0.8" 582 | } 583 | }, 584 | "node_modules/express": { 585 | "version": "4.19.2", 586 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 587 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 588 | "dependencies": { 589 | "accepts": "~1.3.8", 590 | "array-flatten": "1.1.1", 591 | "body-parser": "1.20.2", 592 | "content-disposition": "0.5.4", 593 | "content-type": "~1.0.4", 594 | "cookie": "0.6.0", 595 | "cookie-signature": "1.0.6", 596 | "debug": "2.6.9", 597 | "depd": "2.0.0", 598 | "encodeurl": "~1.0.2", 599 | "escape-html": "~1.0.3", 600 | "etag": "~1.8.1", 601 | "finalhandler": "1.2.0", 602 | "fresh": "0.5.2", 603 | "http-errors": "2.0.0", 604 | "merge-descriptors": "1.0.1", 605 | "methods": "~1.1.2", 606 | "on-finished": "2.4.1", 607 | "parseurl": "~1.3.3", 608 | "path-to-regexp": "0.1.7", 609 | "proxy-addr": "~2.0.7", 610 | "qs": "6.11.0", 611 | "range-parser": "~1.2.1", 612 | "safe-buffer": "5.2.1", 613 | "send": "0.18.0", 614 | "serve-static": "1.15.0", 615 | "setprototypeof": "1.2.0", 616 | "statuses": "2.0.1", 617 | "type-is": "~1.6.18", 618 | "utils-merge": "1.0.1", 619 | "vary": "~1.1.2" 620 | }, 621 | "engines": { 622 | "node": ">= 0.10.0" 623 | } 624 | }, 625 | "node_modules/express-handlebars": { 626 | "version": "6.0.1", 627 | "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-6.0.1.tgz", 628 | "integrity": "sha512-K3Lemki5jkD3sZwDhgBEBk+oAl1xg4nsMJAfpq1AUl5K187/mU1/xKVWt+4RZAHAxlyQFk4YBfX5+00AzLNfWg==", 629 | "dependencies": { 630 | "glob": "^7.2.0", 631 | "graceful-fs": "^4.2.8", 632 | "handlebars": "^4.7.7" 633 | }, 634 | "engines": { 635 | "node": ">=v12.22.7" 636 | } 637 | }, 638 | "node_modules/express-session": { 639 | "version": "1.17.2", 640 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", 641 | "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", 642 | "dependencies": { 643 | "cookie": "0.4.1", 644 | "cookie-signature": "1.0.6", 645 | "debug": "2.6.9", 646 | "depd": "~2.0.0", 647 | "on-headers": "~1.0.2", 648 | "parseurl": "~1.3.3", 649 | "safe-buffer": "5.2.1", 650 | "uid-safe": "~2.1.5" 651 | }, 652 | "engines": { 653 | "node": ">= 0.8.0" 654 | } 655 | }, 656 | "node_modules/express-session/node_modules/cookie": { 657 | "version": "0.4.1", 658 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 659 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 660 | "engines": { 661 | "node": ">= 0.6" 662 | } 663 | }, 664 | "node_modules/express-session/node_modules/safe-buffer": { 665 | "version": "5.2.1", 666 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 667 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 668 | "funding": [ 669 | { 670 | "type": "github", 671 | "url": "https://github.com/sponsors/feross" 672 | }, 673 | { 674 | "type": "patreon", 675 | "url": "https://www.patreon.com/feross" 676 | }, 677 | { 678 | "type": "consulting", 679 | "url": "https://feross.org/support" 680 | } 681 | ] 682 | }, 683 | "node_modules/express/node_modules/safe-buffer": { 684 | "version": "5.2.1", 685 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 686 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 687 | "funding": [ 688 | { 689 | "type": "github", 690 | "url": "https://github.com/sponsors/feross" 691 | }, 692 | { 693 | "type": "patreon", 694 | "url": "https://www.patreon.com/feross" 695 | }, 696 | { 697 | "type": "consulting", 698 | "url": "https://feross.org/support" 699 | } 700 | ] 701 | }, 702 | "node_modules/filesize": { 703 | "version": "8.0.6", 704 | "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz", 705 | "integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg==", 706 | "engines": { 707 | "node": ">= 0.4.0" 708 | } 709 | }, 710 | "node_modules/fill-range": { 711 | "version": "7.0.1", 712 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 713 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 714 | "dev": true, 715 | "dependencies": { 716 | "to-regex-range": "^5.0.1" 717 | }, 718 | "engines": { 719 | "node": ">=8" 720 | } 721 | }, 722 | "node_modules/finalhandler": { 723 | "version": "1.2.0", 724 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 725 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 726 | "dependencies": { 727 | "debug": "2.6.9", 728 | "encodeurl": "~1.0.2", 729 | "escape-html": "~1.0.3", 730 | "on-finished": "2.4.1", 731 | "parseurl": "~1.3.3", 732 | "statuses": "2.0.1", 733 | "unpipe": "~1.0.0" 734 | }, 735 | "engines": { 736 | "node": ">= 0.8" 737 | } 738 | }, 739 | "node_modules/forwarded": { 740 | "version": "0.2.0", 741 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 742 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 743 | "engines": { 744 | "node": ">= 0.6" 745 | } 746 | }, 747 | "node_modules/fresh": { 748 | "version": "0.5.2", 749 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 750 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 751 | "engines": { 752 | "node": ">= 0.6" 753 | } 754 | }, 755 | "node_modules/fs-constants": { 756 | "version": "1.0.0", 757 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 758 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 759 | }, 760 | "node_modules/fs.realpath": { 761 | "version": "1.0.0", 762 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 763 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 764 | }, 765 | "node_modules/fsevents": { 766 | "version": "2.3.2", 767 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 768 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 769 | "dev": true, 770 | "hasInstallScript": true, 771 | "optional": true, 772 | "os": [ 773 | "darwin" 774 | ], 775 | "engines": { 776 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 777 | } 778 | }, 779 | "node_modules/function-bind": { 780 | "version": "1.1.2", 781 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 782 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 783 | "funding": { 784 | "url": "https://github.com/sponsors/ljharb" 785 | } 786 | }, 787 | "node_modules/get-intrinsic": { 788 | "version": "1.2.4", 789 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 790 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 791 | "dependencies": { 792 | "es-errors": "^1.3.0", 793 | "function-bind": "^1.1.2", 794 | "has-proto": "^1.0.1", 795 | "has-symbols": "^1.0.3", 796 | "hasown": "^2.0.0" 797 | }, 798 | "engines": { 799 | "node": ">= 0.4" 800 | }, 801 | "funding": { 802 | "url": "https://github.com/sponsors/ljharb" 803 | } 804 | }, 805 | "node_modules/glob": { 806 | "version": "7.2.0", 807 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 808 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 809 | "dependencies": { 810 | "fs.realpath": "^1.0.0", 811 | "inflight": "^1.0.4", 812 | "inherits": "2", 813 | "minimatch": "^3.0.4", 814 | "once": "^1.3.0", 815 | "path-is-absolute": "^1.0.0" 816 | }, 817 | "engines": { 818 | "node": "*" 819 | }, 820 | "funding": { 821 | "url": "https://github.com/sponsors/isaacs" 822 | } 823 | }, 824 | "node_modules/glob-parent": { 825 | "version": "5.1.2", 826 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 827 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 828 | "dev": true, 829 | "dependencies": { 830 | "is-glob": "^4.0.1" 831 | }, 832 | "engines": { 833 | "node": ">= 6" 834 | } 835 | }, 836 | "node_modules/gopd": { 837 | "version": "1.0.1", 838 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 839 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 840 | "dependencies": { 841 | "get-intrinsic": "^1.1.3" 842 | }, 843 | "funding": { 844 | "url": "https://github.com/sponsors/ljharb" 845 | } 846 | }, 847 | "node_modules/graceful-fs": { 848 | "version": "4.2.8", 849 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", 850 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" 851 | }, 852 | "node_modules/handlebars": { 853 | "version": "4.7.7", 854 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 855 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 856 | "dependencies": { 857 | "minimist": "^1.2.5", 858 | "neo-async": "^2.6.0", 859 | "source-map": "^0.6.1", 860 | "wordwrap": "^1.0.0" 861 | }, 862 | "bin": { 863 | "handlebars": "bin/handlebars" 864 | }, 865 | "engines": { 866 | "node": ">=0.4.7" 867 | }, 868 | "optionalDependencies": { 869 | "uglify-js": "^3.1.4" 870 | } 871 | }, 872 | "node_modules/has-flag": { 873 | "version": "3.0.0", 874 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 875 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 876 | "dev": true, 877 | "engines": { 878 | "node": ">=4" 879 | } 880 | }, 881 | "node_modules/has-property-descriptors": { 882 | "version": "1.0.2", 883 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 884 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 885 | "dependencies": { 886 | "es-define-property": "^1.0.0" 887 | }, 888 | "funding": { 889 | "url": "https://github.com/sponsors/ljharb" 890 | } 891 | }, 892 | "node_modules/has-proto": { 893 | "version": "1.0.3", 894 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 895 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 896 | "engines": { 897 | "node": ">= 0.4" 898 | }, 899 | "funding": { 900 | "url": "https://github.com/sponsors/ljharb" 901 | } 902 | }, 903 | "node_modules/has-symbols": { 904 | "version": "1.0.3", 905 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 906 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 907 | "engines": { 908 | "node": ">= 0.4" 909 | }, 910 | "funding": { 911 | "url": "https://github.com/sponsors/ljharb" 912 | } 913 | }, 914 | "node_modules/hasown": { 915 | "version": "2.0.2", 916 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 917 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 918 | "dependencies": { 919 | "function-bind": "^1.1.2" 920 | }, 921 | "engines": { 922 | "node": ">= 0.4" 923 | } 924 | }, 925 | "node_modules/http-errors": { 926 | "version": "2.0.0", 927 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 928 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 929 | "dependencies": { 930 | "depd": "2.0.0", 931 | "inherits": "2.0.4", 932 | "setprototypeof": "1.2.0", 933 | "statuses": "2.0.1", 934 | "toidentifier": "1.0.1" 935 | }, 936 | "engines": { 937 | "node": ">= 0.8" 938 | } 939 | }, 940 | "node_modules/iconv-lite": { 941 | "version": "0.4.24", 942 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 943 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 944 | "dependencies": { 945 | "safer-buffer": ">= 2.1.2 < 3" 946 | }, 947 | "engines": { 948 | "node": ">=0.10.0" 949 | } 950 | }, 951 | "node_modules/ieee754": { 952 | "version": "1.2.1", 953 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 954 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 955 | "funding": [ 956 | { 957 | "type": "github", 958 | "url": "https://github.com/sponsors/feross" 959 | }, 960 | { 961 | "type": "patreon", 962 | "url": "https://www.patreon.com/feross" 963 | }, 964 | { 965 | "type": "consulting", 966 | "url": "https://feross.org/support" 967 | } 968 | ] 969 | }, 970 | "node_modules/ignore-by-default": { 971 | "version": "1.0.1", 972 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 973 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 974 | "dev": true 975 | }, 976 | "node_modules/inflight": { 977 | "version": "1.0.6", 978 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 979 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 980 | "dependencies": { 981 | "once": "^1.3.0", 982 | "wrappy": "1" 983 | } 984 | }, 985 | "node_modules/inherits": { 986 | "version": "2.0.4", 987 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 988 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 989 | }, 990 | "node_modules/ipaddr.js": { 991 | "version": "1.9.1", 992 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 993 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 994 | "engines": { 995 | "node": ">= 0.10" 996 | } 997 | }, 998 | "node_modules/is-binary-path": { 999 | "version": "2.1.0", 1000 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1001 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1002 | "dev": true, 1003 | "dependencies": { 1004 | "binary-extensions": "^2.0.0" 1005 | }, 1006 | "engines": { 1007 | "node": ">=8" 1008 | } 1009 | }, 1010 | "node_modules/is-extglob": { 1011 | "version": "2.1.1", 1012 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1013 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1014 | "dev": true, 1015 | "engines": { 1016 | "node": ">=0.10.0" 1017 | } 1018 | }, 1019 | "node_modules/is-glob": { 1020 | "version": "4.0.3", 1021 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1022 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1023 | "dev": true, 1024 | "dependencies": { 1025 | "is-extglob": "^2.1.1" 1026 | }, 1027 | "engines": { 1028 | "node": ">=0.10.0" 1029 | } 1030 | }, 1031 | "node_modules/is-number": { 1032 | "version": "7.0.0", 1033 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1034 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1035 | "dev": true, 1036 | "engines": { 1037 | "node": ">=0.12.0" 1038 | } 1039 | }, 1040 | "node_modules/isarray": { 1041 | "version": "1.0.0", 1042 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1043 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1044 | }, 1045 | "node_modules/jquery": { 1046 | "version": "3.6.0", 1047 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", 1048 | "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" 1049 | }, 1050 | "node_modules/lazystream": { 1051 | "version": "1.0.1", 1052 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", 1053 | "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", 1054 | "dependencies": { 1055 | "readable-stream": "^2.0.5" 1056 | }, 1057 | "engines": { 1058 | "node": ">= 0.6.3" 1059 | } 1060 | }, 1061 | "node_modules/lazystream/node_modules/readable-stream": { 1062 | "version": "2.3.7", 1063 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1064 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1065 | "dependencies": { 1066 | "core-util-is": "~1.0.0", 1067 | "inherits": "~2.0.3", 1068 | "isarray": "~1.0.0", 1069 | "process-nextick-args": "~2.0.0", 1070 | "safe-buffer": "~5.1.1", 1071 | "string_decoder": "~1.1.1", 1072 | "util-deprecate": "~1.0.1" 1073 | } 1074 | }, 1075 | "node_modules/lazystream/node_modules/string_decoder": { 1076 | "version": "1.1.1", 1077 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1078 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1079 | "dependencies": { 1080 | "safe-buffer": "~5.1.0" 1081 | } 1082 | }, 1083 | "node_modules/lodash.defaults": { 1084 | "version": "4.2.0", 1085 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", 1086 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" 1087 | }, 1088 | "node_modules/lodash.difference": { 1089 | "version": "4.5.0", 1090 | "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", 1091 | "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" 1092 | }, 1093 | "node_modules/lodash.flatten": { 1094 | "version": "4.4.0", 1095 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 1096 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 1097 | }, 1098 | "node_modules/lodash.isplainobject": { 1099 | "version": "4.0.6", 1100 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1101 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1102 | }, 1103 | "node_modules/lodash.union": { 1104 | "version": "4.6.0", 1105 | "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", 1106 | "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" 1107 | }, 1108 | "node_modules/media-typer": { 1109 | "version": "0.3.0", 1110 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1111 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1112 | "engines": { 1113 | "node": ">= 0.6" 1114 | } 1115 | }, 1116 | "node_modules/merge-descriptors": { 1117 | "version": "1.0.1", 1118 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1119 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1120 | }, 1121 | "node_modules/methods": { 1122 | "version": "1.1.2", 1123 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1124 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 1125 | "engines": { 1126 | "node": ">= 0.6" 1127 | } 1128 | }, 1129 | "node_modules/mime": { 1130 | "version": "1.6.0", 1131 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1132 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1133 | "bin": { 1134 | "mime": "cli.js" 1135 | }, 1136 | "engines": { 1137 | "node": ">=4" 1138 | } 1139 | }, 1140 | "node_modules/mime-db": { 1141 | "version": "1.52.0", 1142 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1143 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1144 | "engines": { 1145 | "node": ">= 0.6" 1146 | } 1147 | }, 1148 | "node_modules/mime-types": { 1149 | "version": "2.1.35", 1150 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1151 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1152 | "dependencies": { 1153 | "mime-db": "1.52.0" 1154 | }, 1155 | "engines": { 1156 | "node": ">= 0.6" 1157 | } 1158 | }, 1159 | "node_modules/minimatch": { 1160 | "version": "3.1.2", 1161 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1162 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1163 | "dependencies": { 1164 | "brace-expansion": "^1.1.7" 1165 | }, 1166 | "engines": { 1167 | "node": "*" 1168 | } 1169 | }, 1170 | "node_modules/minimist": { 1171 | "version": "1.2.6", 1172 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1173 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 1174 | }, 1175 | "node_modules/ms": { 1176 | "version": "2.0.0", 1177 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1178 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1179 | }, 1180 | "node_modules/nan": { 1181 | "version": "2.15.0", 1182 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", 1183 | "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" 1184 | }, 1185 | "node_modules/negotiator": { 1186 | "version": "0.6.3", 1187 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1188 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1189 | "engines": { 1190 | "node": ">= 0.6" 1191 | } 1192 | }, 1193 | "node_modules/neo-async": { 1194 | "version": "2.6.2", 1195 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1196 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 1197 | }, 1198 | "node_modules/node-pty": { 1199 | "version": "0.10.1", 1200 | "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", 1201 | "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", 1202 | "hasInstallScript": true, 1203 | "dependencies": { 1204 | "nan": "^2.14.0" 1205 | } 1206 | }, 1207 | "node_modules/nodemon": { 1208 | "version": "2.0.20", 1209 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", 1210 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 1211 | "dev": true, 1212 | "dependencies": { 1213 | "chokidar": "^3.5.2", 1214 | "debug": "^3.2.7", 1215 | "ignore-by-default": "^1.0.1", 1216 | "minimatch": "^3.1.2", 1217 | "pstree.remy": "^1.1.8", 1218 | "semver": "^5.7.1", 1219 | "simple-update-notifier": "^1.0.7", 1220 | "supports-color": "^5.5.0", 1221 | "touch": "^3.1.0", 1222 | "undefsafe": "^2.0.5" 1223 | }, 1224 | "bin": { 1225 | "nodemon": "bin/nodemon.js" 1226 | }, 1227 | "engines": { 1228 | "node": ">=8.10.0" 1229 | }, 1230 | "funding": { 1231 | "type": "opencollective", 1232 | "url": "https://opencollective.com/nodemon" 1233 | } 1234 | }, 1235 | "node_modules/nodemon/node_modules/debug": { 1236 | "version": "3.2.7", 1237 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1238 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1239 | "dev": true, 1240 | "dependencies": { 1241 | "ms": "^2.1.1" 1242 | } 1243 | }, 1244 | "node_modules/nodemon/node_modules/ms": { 1245 | "version": "2.1.3", 1246 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1247 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1248 | "dev": true 1249 | }, 1250 | "node_modules/nopt": { 1251 | "version": "1.0.10", 1252 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1253 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1254 | "dev": true, 1255 | "dependencies": { 1256 | "abbrev": "1" 1257 | }, 1258 | "bin": { 1259 | "nopt": "bin/nopt.js" 1260 | }, 1261 | "engines": { 1262 | "node": "*" 1263 | } 1264 | }, 1265 | "node_modules/normalize-path": { 1266 | "version": "3.0.0", 1267 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1268 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1269 | "engines": { 1270 | "node": ">=0.10.0" 1271 | } 1272 | }, 1273 | "node_modules/notp": { 1274 | "version": "2.0.3", 1275 | "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", 1276 | "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=", 1277 | "engines": { 1278 | "node": "> v0.6.0" 1279 | } 1280 | }, 1281 | "node_modules/object-assign": { 1282 | "version": "4.1.1", 1283 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1284 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1285 | "engines": { 1286 | "node": ">=0.10.0" 1287 | } 1288 | }, 1289 | "node_modules/object-inspect": { 1290 | "version": "1.13.1", 1291 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1292 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1293 | "funding": { 1294 | "url": "https://github.com/sponsors/ljharb" 1295 | } 1296 | }, 1297 | "node_modules/on-finished": { 1298 | "version": "2.4.1", 1299 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1300 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1301 | "dependencies": { 1302 | "ee-first": "1.1.1" 1303 | }, 1304 | "engines": { 1305 | "node": ">= 0.8" 1306 | } 1307 | }, 1308 | "node_modules/on-headers": { 1309 | "version": "1.0.2", 1310 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1311 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 1312 | "engines": { 1313 | "node": ">= 0.8" 1314 | } 1315 | }, 1316 | "node_modules/once": { 1317 | "version": "1.4.0", 1318 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1319 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1320 | "dependencies": { 1321 | "wrappy": "1" 1322 | } 1323 | }, 1324 | "node_modules/parseurl": { 1325 | "version": "1.3.3", 1326 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1327 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1328 | "engines": { 1329 | "node": ">= 0.8" 1330 | } 1331 | }, 1332 | "node_modules/path-is-absolute": { 1333 | "version": "1.0.1", 1334 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1335 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1336 | "engines": { 1337 | "node": ">=0.10.0" 1338 | } 1339 | }, 1340 | "node_modules/path-to-regexp": { 1341 | "version": "0.1.7", 1342 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1343 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1344 | }, 1345 | "node_modules/picomatch": { 1346 | "version": "2.3.1", 1347 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1348 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1349 | "dev": true, 1350 | "engines": { 1351 | "node": ">=8.6" 1352 | }, 1353 | "funding": { 1354 | "url": "https://github.com/sponsors/jonschlinkert" 1355 | } 1356 | }, 1357 | "node_modules/prettier": { 1358 | "version": "2.4.1", 1359 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", 1360 | "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", 1361 | "dev": true, 1362 | "bin": { 1363 | "prettier": "bin-prettier.js" 1364 | }, 1365 | "engines": { 1366 | "node": ">=10.13.0" 1367 | } 1368 | }, 1369 | "node_modules/printj": { 1370 | "version": "1.1.2", 1371 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", 1372 | "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", 1373 | "bin": { 1374 | "printj": "bin/printj.njs" 1375 | }, 1376 | "engines": { 1377 | "node": ">=0.8" 1378 | } 1379 | }, 1380 | "node_modules/process-nextick-args": { 1381 | "version": "2.0.1", 1382 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1383 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1384 | }, 1385 | "node_modules/proxy-addr": { 1386 | "version": "2.0.7", 1387 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1388 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1389 | "dependencies": { 1390 | "forwarded": "0.2.0", 1391 | "ipaddr.js": "1.9.1" 1392 | }, 1393 | "engines": { 1394 | "node": ">= 0.10" 1395 | } 1396 | }, 1397 | "node_modules/pstree.remy": { 1398 | "version": "1.1.8", 1399 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1400 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1401 | "dev": true 1402 | }, 1403 | "node_modules/qs": { 1404 | "version": "6.11.0", 1405 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1406 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1407 | "dependencies": { 1408 | "side-channel": "^1.0.4" 1409 | }, 1410 | "engines": { 1411 | "node": ">=0.6" 1412 | }, 1413 | "funding": { 1414 | "url": "https://github.com/sponsors/ljharb" 1415 | } 1416 | }, 1417 | "node_modules/random-bytes": { 1418 | "version": "1.0.0", 1419 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", 1420 | "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", 1421 | "engines": { 1422 | "node": ">= 0.8" 1423 | } 1424 | }, 1425 | "node_modules/range-parser": { 1426 | "version": "1.2.1", 1427 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1428 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1429 | "engines": { 1430 | "node": ">= 0.6" 1431 | } 1432 | }, 1433 | "node_modules/raw-body": { 1434 | "version": "2.5.2", 1435 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1436 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1437 | "dependencies": { 1438 | "bytes": "3.1.2", 1439 | "http-errors": "2.0.0", 1440 | "iconv-lite": "0.4.24", 1441 | "unpipe": "1.0.0" 1442 | }, 1443 | "engines": { 1444 | "node": ">= 0.8" 1445 | } 1446 | }, 1447 | "node_modules/readable-stream": { 1448 | "version": "3.6.0", 1449 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1450 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1451 | "dependencies": { 1452 | "inherits": "^2.0.3", 1453 | "string_decoder": "^1.1.1", 1454 | "util-deprecate": "^1.0.1" 1455 | }, 1456 | "engines": { 1457 | "node": ">= 6" 1458 | } 1459 | }, 1460 | "node_modules/readdir-glob": { 1461 | "version": "1.1.1", 1462 | "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", 1463 | "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", 1464 | "dependencies": { 1465 | "minimatch": "^3.0.4" 1466 | } 1467 | }, 1468 | "node_modules/readdirp": { 1469 | "version": "3.6.0", 1470 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1471 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1472 | "dev": true, 1473 | "dependencies": { 1474 | "picomatch": "^2.2.1" 1475 | }, 1476 | "engines": { 1477 | "node": ">=8.10.0" 1478 | } 1479 | }, 1480 | "node_modules/rimraf": { 1481 | "version": "3.0.2", 1482 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1483 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1484 | "dependencies": { 1485 | "glob": "^7.1.3" 1486 | }, 1487 | "bin": { 1488 | "rimraf": "bin.js" 1489 | }, 1490 | "funding": { 1491 | "url": "https://github.com/sponsors/isaacs" 1492 | } 1493 | }, 1494 | "node_modules/safe-buffer": { 1495 | "version": "5.1.2", 1496 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1497 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1498 | }, 1499 | "node_modules/safer-buffer": { 1500 | "version": "2.1.2", 1501 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1502 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1503 | }, 1504 | "node_modules/semver": { 1505 | "version": "5.7.1", 1506 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1507 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1508 | "dev": true, 1509 | "bin": { 1510 | "semver": "bin/semver" 1511 | } 1512 | }, 1513 | "node_modules/send": { 1514 | "version": "0.18.0", 1515 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1516 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1517 | "dependencies": { 1518 | "debug": "2.6.9", 1519 | "depd": "2.0.0", 1520 | "destroy": "1.2.0", 1521 | "encodeurl": "~1.0.2", 1522 | "escape-html": "~1.0.3", 1523 | "etag": "~1.8.1", 1524 | "fresh": "0.5.2", 1525 | "http-errors": "2.0.0", 1526 | "mime": "1.6.0", 1527 | "ms": "2.1.3", 1528 | "on-finished": "2.4.1", 1529 | "range-parser": "~1.2.1", 1530 | "statuses": "2.0.1" 1531 | }, 1532 | "engines": { 1533 | "node": ">= 0.8.0" 1534 | } 1535 | }, 1536 | "node_modules/send/node_modules/ms": { 1537 | "version": "2.1.3", 1538 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1539 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1540 | }, 1541 | "node_modules/serve-static": { 1542 | "version": "1.15.0", 1543 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1544 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1545 | "dependencies": { 1546 | "encodeurl": "~1.0.2", 1547 | "escape-html": "~1.0.3", 1548 | "parseurl": "~1.3.3", 1549 | "send": "0.18.0" 1550 | }, 1551 | "engines": { 1552 | "node": ">= 0.8.0" 1553 | } 1554 | }, 1555 | "node_modules/set-function-length": { 1556 | "version": "1.2.2", 1557 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1558 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1559 | "dependencies": { 1560 | "define-data-property": "^1.1.4", 1561 | "es-errors": "^1.3.0", 1562 | "function-bind": "^1.1.2", 1563 | "get-intrinsic": "^1.2.4", 1564 | "gopd": "^1.0.1", 1565 | "has-property-descriptors": "^1.0.2" 1566 | }, 1567 | "engines": { 1568 | "node": ">= 0.4" 1569 | } 1570 | }, 1571 | "node_modules/setprototypeof": { 1572 | "version": "1.2.0", 1573 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1574 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1575 | }, 1576 | "node_modules/side-channel": { 1577 | "version": "1.0.6", 1578 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1579 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1580 | "dependencies": { 1581 | "call-bind": "^1.0.7", 1582 | "es-errors": "^1.3.0", 1583 | "get-intrinsic": "^1.2.4", 1584 | "object-inspect": "^1.13.1" 1585 | }, 1586 | "engines": { 1587 | "node": ">= 0.4" 1588 | }, 1589 | "funding": { 1590 | "url": "https://github.com/sponsors/ljharb" 1591 | } 1592 | }, 1593 | "node_modules/simple-update-notifier": { 1594 | "version": "1.1.0", 1595 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 1596 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 1597 | "dev": true, 1598 | "dependencies": { 1599 | "semver": "~7.0.0" 1600 | }, 1601 | "engines": { 1602 | "node": ">=8.10.0" 1603 | } 1604 | }, 1605 | "node_modules/simple-update-notifier/node_modules/semver": { 1606 | "version": "7.0.0", 1607 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1608 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1609 | "dev": true, 1610 | "bin": { 1611 | "semver": "bin/semver.js" 1612 | } 1613 | }, 1614 | "node_modules/source-map": { 1615 | "version": "0.6.1", 1616 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1617 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1618 | "engines": { 1619 | "node": ">=0.10.0" 1620 | } 1621 | }, 1622 | "node_modules/statuses": { 1623 | "version": "2.0.1", 1624 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1625 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1626 | "engines": { 1627 | "node": ">= 0.8" 1628 | } 1629 | }, 1630 | "node_modules/streamsearch": { 1631 | "version": "0.1.2", 1632 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1633 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", 1634 | "engines": { 1635 | "node": ">=0.8.0" 1636 | } 1637 | }, 1638 | "node_modules/string_decoder": { 1639 | "version": "1.3.0", 1640 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1641 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1642 | "dependencies": { 1643 | "safe-buffer": "~5.2.0" 1644 | } 1645 | }, 1646 | "node_modules/string_decoder/node_modules/safe-buffer": { 1647 | "version": "5.2.1", 1648 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1649 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1650 | "funding": [ 1651 | { 1652 | "type": "github", 1653 | "url": "https://github.com/sponsors/feross" 1654 | }, 1655 | { 1656 | "type": "patreon", 1657 | "url": "https://www.patreon.com/feross" 1658 | }, 1659 | { 1660 | "type": "consulting", 1661 | "url": "https://feross.org/support" 1662 | } 1663 | ] 1664 | }, 1665 | "node_modules/supports-color": { 1666 | "version": "5.5.0", 1667 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1668 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1669 | "dev": true, 1670 | "dependencies": { 1671 | "has-flag": "^3.0.0" 1672 | }, 1673 | "engines": { 1674 | "node": ">=4" 1675 | } 1676 | }, 1677 | "node_modules/tar-stream": { 1678 | "version": "2.2.0", 1679 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1680 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1681 | "dependencies": { 1682 | "bl": "^4.0.3", 1683 | "end-of-stream": "^1.4.1", 1684 | "fs-constants": "^1.0.0", 1685 | "inherits": "^2.0.3", 1686 | "readable-stream": "^3.1.1" 1687 | }, 1688 | "engines": { 1689 | "node": ">=6" 1690 | } 1691 | }, 1692 | "node_modules/thirty-two": { 1693 | "version": "1.0.2", 1694 | "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", 1695 | "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=", 1696 | "engines": { 1697 | "node": ">=0.2.6" 1698 | } 1699 | }, 1700 | "node_modules/to-regex-range": { 1701 | "version": "5.0.1", 1702 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1703 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1704 | "dev": true, 1705 | "dependencies": { 1706 | "is-number": "^7.0.0" 1707 | }, 1708 | "engines": { 1709 | "node": ">=8.0" 1710 | } 1711 | }, 1712 | "node_modules/toidentifier": { 1713 | "version": "1.0.1", 1714 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1715 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1716 | "engines": { 1717 | "node": ">=0.6" 1718 | } 1719 | }, 1720 | "node_modules/touch": { 1721 | "version": "3.1.0", 1722 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1723 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1724 | "dev": true, 1725 | "dependencies": { 1726 | "nopt": "~1.0.10" 1727 | }, 1728 | "bin": { 1729 | "nodetouch": "bin/nodetouch.js" 1730 | } 1731 | }, 1732 | "node_modules/type-is": { 1733 | "version": "1.6.18", 1734 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1735 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1736 | "dependencies": { 1737 | "media-typer": "0.3.0", 1738 | "mime-types": "~2.1.24" 1739 | }, 1740 | "engines": { 1741 | "node": ">= 0.6" 1742 | } 1743 | }, 1744 | "node_modules/uglify-js": { 1745 | "version": "3.14.3", 1746 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", 1747 | "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", 1748 | "optional": true, 1749 | "bin": { 1750 | "uglifyjs": "bin/uglifyjs" 1751 | }, 1752 | "engines": { 1753 | "node": ">=0.8.0" 1754 | } 1755 | }, 1756 | "node_modules/uid-safe": { 1757 | "version": "2.1.5", 1758 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", 1759 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", 1760 | "dependencies": { 1761 | "random-bytes": "~1.0.0" 1762 | }, 1763 | "engines": { 1764 | "node": ">= 0.8" 1765 | } 1766 | }, 1767 | "node_modules/undefsafe": { 1768 | "version": "2.0.5", 1769 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1770 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1771 | "dev": true 1772 | }, 1773 | "node_modules/unpipe": { 1774 | "version": "1.0.0", 1775 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1776 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1777 | "engines": { 1778 | "node": ">= 0.8" 1779 | } 1780 | }, 1781 | "node_modules/util-deprecate": { 1782 | "version": "1.0.2", 1783 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1784 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1785 | }, 1786 | "node_modules/utils-merge": { 1787 | "version": "1.0.1", 1788 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1789 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1790 | "engines": { 1791 | "node": ">= 0.4.0" 1792 | } 1793 | }, 1794 | "node_modules/vary": { 1795 | "version": "1.1.2", 1796 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1797 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1798 | "engines": { 1799 | "node": ">= 0.8" 1800 | } 1801 | }, 1802 | "node_modules/wordwrap": { 1803 | "version": "1.0.0", 1804 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1805 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1806 | }, 1807 | "node_modules/wrappy": { 1808 | "version": "1.0.2", 1809 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1810 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1811 | }, 1812 | "node_modules/ws": { 1813 | "version": "8.5.0", 1814 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 1815 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 1816 | "engines": { 1817 | "node": ">=10.0.0" 1818 | }, 1819 | "peerDependencies": { 1820 | "bufferutil": "^4.0.1", 1821 | "utf-8-validate": "^5.0.2" 1822 | }, 1823 | "peerDependenciesMeta": { 1824 | "bufferutil": { 1825 | "optional": true 1826 | }, 1827 | "utf-8-validate": { 1828 | "optional": true 1829 | } 1830 | } 1831 | }, 1832 | "node_modules/xterm": { 1833 | "version": "4.15.0", 1834 | "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.15.0.tgz", 1835 | "integrity": "sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw==" 1836 | }, 1837 | "node_modules/xterm-addon-attach": { 1838 | "version": "0.6.0", 1839 | "resolved": "https://registry.npmjs.org/xterm-addon-attach/-/xterm-addon-attach-0.6.0.tgz", 1840 | "integrity": "sha512-Mo8r3HTjI/EZfczVCwRU6jh438B4WLXxdFO86OB7bx0jGhwh2GdF4ifx/rP+OB+Cb2vmLhhVIZ00/7x3YSP3dg==", 1841 | "peerDependencies": { 1842 | "xterm": "^4.0.0" 1843 | } 1844 | }, 1845 | "node_modules/xterm-addon-fit": { 1846 | "version": "0.5.0", 1847 | "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz", 1848 | "integrity": "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==", 1849 | "peerDependencies": { 1850 | "xterm": "^4.0.0" 1851 | } 1852 | }, 1853 | "node_modules/zip-stream": { 1854 | "version": "4.1.0", 1855 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", 1856 | "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", 1857 | "dependencies": { 1858 | "archiver-utils": "^2.1.0", 1859 | "compress-commons": "^4.1.0", 1860 | "readable-stream": "^3.6.0" 1861 | }, 1862 | "engines": { 1863 | "node": ">= 10" 1864 | } 1865 | } 1866 | }, 1867 | "dependencies": { 1868 | "@popperjs/core": { 1869 | "version": "2.10.2", 1870 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz", 1871 | "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==", 1872 | "peer": true 1873 | }, 1874 | "@primer/octicons": { 1875 | "version": "16.1.1", 1876 | "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-16.1.1.tgz", 1877 | "integrity": "sha512-qlMErXg4I7oOofP4d5GceLbNpjTRSkyLoe5Ng1mfebtTvjeBj8x+kdqgwFWLRp7QO1ye5AaxcCvn1AJMAeURzw==", 1878 | "requires": { 1879 | "object-assign": "^4.1.1" 1880 | } 1881 | }, 1882 | "abbrev": { 1883 | "version": "1.1.1", 1884 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1885 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1886 | "dev": true 1887 | }, 1888 | "accepts": { 1889 | "version": "1.3.8", 1890 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1891 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1892 | "requires": { 1893 | "mime-types": "~2.1.34", 1894 | "negotiator": "0.6.3" 1895 | } 1896 | }, 1897 | "anymatch": { 1898 | "version": "3.1.2", 1899 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1900 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1901 | "dev": true, 1902 | "requires": { 1903 | "normalize-path": "^3.0.0", 1904 | "picomatch": "^2.0.4" 1905 | } 1906 | }, 1907 | "archiver": { 1908 | "version": "5.3.0", 1909 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", 1910 | "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", 1911 | "requires": { 1912 | "archiver-utils": "^2.1.0", 1913 | "async": "^3.2.0", 1914 | "buffer-crc32": "^0.2.1", 1915 | "readable-stream": "^3.6.0", 1916 | "readdir-glob": "^1.0.0", 1917 | "tar-stream": "^2.2.0", 1918 | "zip-stream": "^4.1.0" 1919 | } 1920 | }, 1921 | "archiver-utils": { 1922 | "version": "2.1.0", 1923 | "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", 1924 | "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", 1925 | "requires": { 1926 | "glob": "^7.1.4", 1927 | "graceful-fs": "^4.2.0", 1928 | "lazystream": "^1.0.0", 1929 | "lodash.defaults": "^4.2.0", 1930 | "lodash.difference": "^4.5.0", 1931 | "lodash.flatten": "^4.4.0", 1932 | "lodash.isplainobject": "^4.0.6", 1933 | "lodash.union": "^4.6.0", 1934 | "normalize-path": "^3.0.0", 1935 | "readable-stream": "^2.0.0" 1936 | }, 1937 | "dependencies": { 1938 | "readable-stream": { 1939 | "version": "2.3.7", 1940 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1941 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1942 | "requires": { 1943 | "core-util-is": "~1.0.0", 1944 | "inherits": "~2.0.3", 1945 | "isarray": "~1.0.0", 1946 | "process-nextick-args": "~2.0.0", 1947 | "safe-buffer": "~5.1.1", 1948 | "string_decoder": "~1.1.1", 1949 | "util-deprecate": "~1.0.1" 1950 | } 1951 | }, 1952 | "string_decoder": { 1953 | "version": "1.1.1", 1954 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1955 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1956 | "requires": { 1957 | "safe-buffer": "~5.1.0" 1958 | } 1959 | } 1960 | } 1961 | }, 1962 | "array-flatten": { 1963 | "version": "1.1.1", 1964 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1965 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 1966 | }, 1967 | "async": { 1968 | "version": "3.2.2", 1969 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", 1970 | "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" 1971 | }, 1972 | "balanced-match": { 1973 | "version": "1.0.2", 1974 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1975 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1976 | }, 1977 | "base64-js": { 1978 | "version": "1.5.1", 1979 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1980 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 1981 | }, 1982 | "binary-extensions": { 1983 | "version": "2.2.0", 1984 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1985 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1986 | "dev": true 1987 | }, 1988 | "bl": { 1989 | "version": "4.1.0", 1990 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 1991 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 1992 | "requires": { 1993 | "buffer": "^5.5.0", 1994 | "inherits": "^2.0.4", 1995 | "readable-stream": "^3.4.0" 1996 | } 1997 | }, 1998 | "body-parser": { 1999 | "version": "1.20.2", 2000 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 2001 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 2002 | "requires": { 2003 | "bytes": "3.1.2", 2004 | "content-type": "~1.0.5", 2005 | "debug": "2.6.9", 2006 | "depd": "2.0.0", 2007 | "destroy": "1.2.0", 2008 | "http-errors": "2.0.0", 2009 | "iconv-lite": "0.4.24", 2010 | "on-finished": "2.4.1", 2011 | "qs": "6.11.0", 2012 | "raw-body": "2.5.2", 2013 | "type-is": "~1.6.18", 2014 | "unpipe": "1.0.0" 2015 | } 2016 | }, 2017 | "bootstrap": { 2018 | "version": "5.1.3", 2019 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", 2020 | "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", 2021 | "requires": {} 2022 | }, 2023 | "brace-expansion": { 2024 | "version": "1.1.11", 2025 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2026 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2027 | "requires": { 2028 | "balanced-match": "^1.0.0", 2029 | "concat-map": "0.0.1" 2030 | } 2031 | }, 2032 | "braces": { 2033 | "version": "3.0.2", 2034 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2035 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2036 | "dev": true, 2037 | "requires": { 2038 | "fill-range": "^7.0.1" 2039 | } 2040 | }, 2041 | "buffer": { 2042 | "version": "5.7.1", 2043 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 2044 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 2045 | "requires": { 2046 | "base64-js": "^1.3.1", 2047 | "ieee754": "^1.1.13" 2048 | } 2049 | }, 2050 | "buffer-crc32": { 2051 | "version": "0.2.13", 2052 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 2053 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 2054 | }, 2055 | "busboy": { 2056 | "version": "0.3.1", 2057 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", 2058 | "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", 2059 | "requires": { 2060 | "dicer": "0.3.0" 2061 | } 2062 | }, 2063 | "bytes": { 2064 | "version": "3.1.2", 2065 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 2066 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 2067 | }, 2068 | "call-bind": { 2069 | "version": "1.0.7", 2070 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 2071 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 2072 | "requires": { 2073 | "es-define-property": "^1.0.0", 2074 | "es-errors": "^1.3.0", 2075 | "function-bind": "^1.1.2", 2076 | "get-intrinsic": "^1.2.4", 2077 | "set-function-length": "^1.2.1" 2078 | } 2079 | }, 2080 | "chokidar": { 2081 | "version": "3.5.3", 2082 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2083 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2084 | "dev": true, 2085 | "requires": { 2086 | "anymatch": "~3.1.2", 2087 | "braces": "~3.0.2", 2088 | "fsevents": "~2.3.2", 2089 | "glob-parent": "~5.1.2", 2090 | "is-binary-path": "~2.1.0", 2091 | "is-glob": "~4.0.1", 2092 | "normalize-path": "~3.0.0", 2093 | "readdirp": "~3.6.0" 2094 | } 2095 | }, 2096 | "compress-commons": { 2097 | "version": "4.1.1", 2098 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", 2099 | "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", 2100 | "requires": { 2101 | "buffer-crc32": "^0.2.13", 2102 | "crc32-stream": "^4.0.2", 2103 | "normalize-path": "^3.0.0", 2104 | "readable-stream": "^3.6.0" 2105 | } 2106 | }, 2107 | "concat-map": { 2108 | "version": "0.0.1", 2109 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2110 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 2111 | }, 2112 | "connect-busboy": { 2113 | "version": "0.0.2", 2114 | "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", 2115 | "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", 2116 | "requires": { 2117 | "busboy": "*" 2118 | } 2119 | }, 2120 | "connect-flash": { 2121 | "version": "0.1.1", 2122 | "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", 2123 | "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" 2124 | }, 2125 | "content-disposition": { 2126 | "version": "0.5.4", 2127 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 2128 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 2129 | "requires": { 2130 | "safe-buffer": "5.2.1" 2131 | }, 2132 | "dependencies": { 2133 | "safe-buffer": { 2134 | "version": "5.2.1", 2135 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2136 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2137 | } 2138 | } 2139 | }, 2140 | "content-type": { 2141 | "version": "1.0.5", 2142 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 2143 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 2144 | }, 2145 | "cookie": { 2146 | "version": "0.6.0", 2147 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 2148 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" 2149 | }, 2150 | "cookie-signature": { 2151 | "version": "1.0.6", 2152 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 2153 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 2154 | }, 2155 | "core-util-is": { 2156 | "version": "1.0.3", 2157 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 2158 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 2159 | }, 2160 | "crc-32": { 2161 | "version": "1.2.0", 2162 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", 2163 | "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", 2164 | "requires": { 2165 | "exit-on-epipe": "~1.0.1", 2166 | "printj": "~1.1.0" 2167 | } 2168 | }, 2169 | "crc32-stream": { 2170 | "version": "4.0.2", 2171 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", 2172 | "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", 2173 | "requires": { 2174 | "crc-32": "^1.2.0", 2175 | "readable-stream": "^3.4.0" 2176 | } 2177 | }, 2178 | "debug": { 2179 | "version": "2.6.9", 2180 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2181 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2182 | "requires": { 2183 | "ms": "2.0.0" 2184 | } 2185 | }, 2186 | "define-data-property": { 2187 | "version": "1.1.4", 2188 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 2189 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 2190 | "requires": { 2191 | "es-define-property": "^1.0.0", 2192 | "es-errors": "^1.3.0", 2193 | "gopd": "^1.0.1" 2194 | } 2195 | }, 2196 | "depd": { 2197 | "version": "2.0.0", 2198 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 2199 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 2200 | }, 2201 | "destroy": { 2202 | "version": "1.2.0", 2203 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 2204 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 2205 | }, 2206 | "dicer": { 2207 | "version": "0.3.0", 2208 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 2209 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 2210 | "requires": { 2211 | "streamsearch": "0.1.2" 2212 | } 2213 | }, 2214 | "ee-first": { 2215 | "version": "1.1.1", 2216 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 2217 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 2218 | }, 2219 | "encodeurl": { 2220 | "version": "1.0.2", 2221 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2222 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 2223 | }, 2224 | "end-of-stream": { 2225 | "version": "1.4.4", 2226 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 2227 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 2228 | "requires": { 2229 | "once": "^1.4.0" 2230 | } 2231 | }, 2232 | "es-define-property": { 2233 | "version": "1.0.0", 2234 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 2235 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 2236 | "requires": { 2237 | "get-intrinsic": "^1.2.4" 2238 | } 2239 | }, 2240 | "es-errors": { 2241 | "version": "1.3.0", 2242 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 2243 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 2244 | }, 2245 | "escape-html": { 2246 | "version": "1.0.3", 2247 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 2248 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 2249 | }, 2250 | "etag": { 2251 | "version": "1.8.1", 2252 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 2253 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 2254 | }, 2255 | "exit-on-epipe": { 2256 | "version": "1.0.1", 2257 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", 2258 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" 2259 | }, 2260 | "express": { 2261 | "version": "4.19.2", 2262 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 2263 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 2264 | "requires": { 2265 | "accepts": "~1.3.8", 2266 | "array-flatten": "1.1.1", 2267 | "body-parser": "1.20.2", 2268 | "content-disposition": "0.5.4", 2269 | "content-type": "~1.0.4", 2270 | "cookie": "0.6.0", 2271 | "cookie-signature": "1.0.6", 2272 | "debug": "2.6.9", 2273 | "depd": "2.0.0", 2274 | "encodeurl": "~1.0.2", 2275 | "escape-html": "~1.0.3", 2276 | "etag": "~1.8.1", 2277 | "finalhandler": "1.2.0", 2278 | "fresh": "0.5.2", 2279 | "http-errors": "2.0.0", 2280 | "merge-descriptors": "1.0.1", 2281 | "methods": "~1.1.2", 2282 | "on-finished": "2.4.1", 2283 | "parseurl": "~1.3.3", 2284 | "path-to-regexp": "0.1.7", 2285 | "proxy-addr": "~2.0.7", 2286 | "qs": "6.11.0", 2287 | "range-parser": "~1.2.1", 2288 | "safe-buffer": "5.2.1", 2289 | "send": "0.18.0", 2290 | "serve-static": "1.15.0", 2291 | "setprototypeof": "1.2.0", 2292 | "statuses": "2.0.1", 2293 | "type-is": "~1.6.18", 2294 | "utils-merge": "1.0.1", 2295 | "vary": "~1.1.2" 2296 | }, 2297 | "dependencies": { 2298 | "safe-buffer": { 2299 | "version": "5.2.1", 2300 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2301 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2302 | } 2303 | } 2304 | }, 2305 | "express-handlebars": { 2306 | "version": "6.0.1", 2307 | "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-6.0.1.tgz", 2308 | "integrity": "sha512-K3Lemki5jkD3sZwDhgBEBk+oAl1xg4nsMJAfpq1AUl5K187/mU1/xKVWt+4RZAHAxlyQFk4YBfX5+00AzLNfWg==", 2309 | "requires": { 2310 | "glob": "^7.2.0", 2311 | "graceful-fs": "^4.2.8", 2312 | "handlebars": "^4.7.7" 2313 | } 2314 | }, 2315 | "express-session": { 2316 | "version": "1.17.2", 2317 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", 2318 | "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", 2319 | "requires": { 2320 | "cookie": "0.4.1", 2321 | "cookie-signature": "1.0.6", 2322 | "debug": "2.6.9", 2323 | "depd": "~2.0.0", 2324 | "on-headers": "~1.0.2", 2325 | "parseurl": "~1.3.3", 2326 | "safe-buffer": "5.2.1", 2327 | "uid-safe": "~2.1.5" 2328 | }, 2329 | "dependencies": { 2330 | "cookie": { 2331 | "version": "0.4.1", 2332 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 2333 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 2334 | }, 2335 | "safe-buffer": { 2336 | "version": "5.2.1", 2337 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2338 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2339 | } 2340 | } 2341 | }, 2342 | "filesize": { 2343 | "version": "8.0.6", 2344 | "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.6.tgz", 2345 | "integrity": "sha512-sHvRqTiwdmcuzqet7iVwsbwF6UrV3wIgDf2SHNdY1Hgl8PC45HZg/0xtdw6U2izIV4lccnrY9ftl6wZFNdjYMg==" 2346 | }, 2347 | "fill-range": { 2348 | "version": "7.0.1", 2349 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2350 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2351 | "dev": true, 2352 | "requires": { 2353 | "to-regex-range": "^5.0.1" 2354 | } 2355 | }, 2356 | "finalhandler": { 2357 | "version": "1.2.0", 2358 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 2359 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 2360 | "requires": { 2361 | "debug": "2.6.9", 2362 | "encodeurl": "~1.0.2", 2363 | "escape-html": "~1.0.3", 2364 | "on-finished": "2.4.1", 2365 | "parseurl": "~1.3.3", 2366 | "statuses": "2.0.1", 2367 | "unpipe": "~1.0.0" 2368 | } 2369 | }, 2370 | "forwarded": { 2371 | "version": "0.2.0", 2372 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 2373 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 2374 | }, 2375 | "fresh": { 2376 | "version": "0.5.2", 2377 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2378 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 2379 | }, 2380 | "fs-constants": { 2381 | "version": "1.0.0", 2382 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 2383 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 2384 | }, 2385 | "fs.realpath": { 2386 | "version": "1.0.0", 2387 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2388 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 2389 | }, 2390 | "fsevents": { 2391 | "version": "2.3.2", 2392 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2393 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2394 | "dev": true, 2395 | "optional": true 2396 | }, 2397 | "function-bind": { 2398 | "version": "1.1.2", 2399 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2400 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 2401 | }, 2402 | "get-intrinsic": { 2403 | "version": "1.2.4", 2404 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 2405 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 2406 | "requires": { 2407 | "es-errors": "^1.3.0", 2408 | "function-bind": "^1.1.2", 2409 | "has-proto": "^1.0.1", 2410 | "has-symbols": "^1.0.3", 2411 | "hasown": "^2.0.0" 2412 | } 2413 | }, 2414 | "glob": { 2415 | "version": "7.2.0", 2416 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2417 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2418 | "requires": { 2419 | "fs.realpath": "^1.0.0", 2420 | "inflight": "^1.0.4", 2421 | "inherits": "2", 2422 | "minimatch": "^3.0.4", 2423 | "once": "^1.3.0", 2424 | "path-is-absolute": "^1.0.0" 2425 | } 2426 | }, 2427 | "glob-parent": { 2428 | "version": "5.1.2", 2429 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2430 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2431 | "dev": true, 2432 | "requires": { 2433 | "is-glob": "^4.0.1" 2434 | } 2435 | }, 2436 | "gopd": { 2437 | "version": "1.0.1", 2438 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 2439 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 2440 | "requires": { 2441 | "get-intrinsic": "^1.1.3" 2442 | } 2443 | }, 2444 | "graceful-fs": { 2445 | "version": "4.2.8", 2446 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", 2447 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" 2448 | }, 2449 | "handlebars": { 2450 | "version": "4.7.7", 2451 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 2452 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 2453 | "requires": { 2454 | "minimist": "^1.2.5", 2455 | "neo-async": "^2.6.0", 2456 | "source-map": "^0.6.1", 2457 | "uglify-js": "^3.1.4", 2458 | "wordwrap": "^1.0.0" 2459 | } 2460 | }, 2461 | "has-flag": { 2462 | "version": "3.0.0", 2463 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2464 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 2465 | "dev": true 2466 | }, 2467 | "has-property-descriptors": { 2468 | "version": "1.0.2", 2469 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 2470 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 2471 | "requires": { 2472 | "es-define-property": "^1.0.0" 2473 | } 2474 | }, 2475 | "has-proto": { 2476 | "version": "1.0.3", 2477 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 2478 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" 2479 | }, 2480 | "has-symbols": { 2481 | "version": "1.0.3", 2482 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2483 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 2484 | }, 2485 | "hasown": { 2486 | "version": "2.0.2", 2487 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2488 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2489 | "requires": { 2490 | "function-bind": "^1.1.2" 2491 | } 2492 | }, 2493 | "http-errors": { 2494 | "version": "2.0.0", 2495 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 2496 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 2497 | "requires": { 2498 | "depd": "2.0.0", 2499 | "inherits": "2.0.4", 2500 | "setprototypeof": "1.2.0", 2501 | "statuses": "2.0.1", 2502 | "toidentifier": "1.0.1" 2503 | } 2504 | }, 2505 | "iconv-lite": { 2506 | "version": "0.4.24", 2507 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2508 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2509 | "requires": { 2510 | "safer-buffer": ">= 2.1.2 < 3" 2511 | } 2512 | }, 2513 | "ieee754": { 2514 | "version": "1.2.1", 2515 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2516 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 2517 | }, 2518 | "ignore-by-default": { 2519 | "version": "1.0.1", 2520 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 2521 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 2522 | "dev": true 2523 | }, 2524 | "inflight": { 2525 | "version": "1.0.6", 2526 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2527 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2528 | "requires": { 2529 | "once": "^1.3.0", 2530 | "wrappy": "1" 2531 | } 2532 | }, 2533 | "inherits": { 2534 | "version": "2.0.4", 2535 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2536 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2537 | }, 2538 | "ipaddr.js": { 2539 | "version": "1.9.1", 2540 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2541 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 2542 | }, 2543 | "is-binary-path": { 2544 | "version": "2.1.0", 2545 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2546 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2547 | "dev": true, 2548 | "requires": { 2549 | "binary-extensions": "^2.0.0" 2550 | } 2551 | }, 2552 | "is-extglob": { 2553 | "version": "2.1.1", 2554 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2555 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2556 | "dev": true 2557 | }, 2558 | "is-glob": { 2559 | "version": "4.0.3", 2560 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2561 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2562 | "dev": true, 2563 | "requires": { 2564 | "is-extglob": "^2.1.1" 2565 | } 2566 | }, 2567 | "is-number": { 2568 | "version": "7.0.0", 2569 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2570 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2571 | "dev": true 2572 | }, 2573 | "isarray": { 2574 | "version": "1.0.0", 2575 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2576 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2577 | }, 2578 | "jquery": { 2579 | "version": "3.6.0", 2580 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", 2581 | "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" 2582 | }, 2583 | "lazystream": { 2584 | "version": "1.0.1", 2585 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", 2586 | "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", 2587 | "requires": { 2588 | "readable-stream": "^2.0.5" 2589 | }, 2590 | "dependencies": { 2591 | "readable-stream": { 2592 | "version": "2.3.7", 2593 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2594 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2595 | "requires": { 2596 | "core-util-is": "~1.0.0", 2597 | "inherits": "~2.0.3", 2598 | "isarray": "~1.0.0", 2599 | "process-nextick-args": "~2.0.0", 2600 | "safe-buffer": "~5.1.1", 2601 | "string_decoder": "~1.1.1", 2602 | "util-deprecate": "~1.0.1" 2603 | } 2604 | }, 2605 | "string_decoder": { 2606 | "version": "1.1.1", 2607 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2608 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2609 | "requires": { 2610 | "safe-buffer": "~5.1.0" 2611 | } 2612 | } 2613 | } 2614 | }, 2615 | "lodash.defaults": { 2616 | "version": "4.2.0", 2617 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", 2618 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" 2619 | }, 2620 | "lodash.difference": { 2621 | "version": "4.5.0", 2622 | "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", 2623 | "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" 2624 | }, 2625 | "lodash.flatten": { 2626 | "version": "4.4.0", 2627 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 2628 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 2629 | }, 2630 | "lodash.isplainobject": { 2631 | "version": "4.0.6", 2632 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2633 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 2634 | }, 2635 | "lodash.union": { 2636 | "version": "4.6.0", 2637 | "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", 2638 | "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" 2639 | }, 2640 | "media-typer": { 2641 | "version": "0.3.0", 2642 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2643 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 2644 | }, 2645 | "merge-descriptors": { 2646 | "version": "1.0.1", 2647 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2648 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2649 | }, 2650 | "methods": { 2651 | "version": "1.1.2", 2652 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2653 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2654 | }, 2655 | "mime": { 2656 | "version": "1.6.0", 2657 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2658 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2659 | }, 2660 | "mime-db": { 2661 | "version": "1.52.0", 2662 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2663 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 2664 | }, 2665 | "mime-types": { 2666 | "version": "2.1.35", 2667 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2668 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2669 | "requires": { 2670 | "mime-db": "1.52.0" 2671 | } 2672 | }, 2673 | "minimatch": { 2674 | "version": "3.1.2", 2675 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2676 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2677 | "requires": { 2678 | "brace-expansion": "^1.1.7" 2679 | } 2680 | }, 2681 | "minimist": { 2682 | "version": "1.2.6", 2683 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2684 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 2685 | }, 2686 | "ms": { 2687 | "version": "2.0.0", 2688 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2689 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2690 | }, 2691 | "nan": { 2692 | "version": "2.15.0", 2693 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", 2694 | "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" 2695 | }, 2696 | "negotiator": { 2697 | "version": "0.6.3", 2698 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2699 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 2700 | }, 2701 | "neo-async": { 2702 | "version": "2.6.2", 2703 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 2704 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 2705 | }, 2706 | "node-pty": { 2707 | "version": "0.10.1", 2708 | "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", 2709 | "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", 2710 | "requires": { 2711 | "nan": "^2.14.0" 2712 | } 2713 | }, 2714 | "nodemon": { 2715 | "version": "2.0.20", 2716 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", 2717 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 2718 | "dev": true, 2719 | "requires": { 2720 | "chokidar": "^3.5.2", 2721 | "debug": "^3.2.7", 2722 | "ignore-by-default": "^1.0.1", 2723 | "minimatch": "^3.1.2", 2724 | "pstree.remy": "^1.1.8", 2725 | "semver": "^5.7.1", 2726 | "simple-update-notifier": "^1.0.7", 2727 | "supports-color": "^5.5.0", 2728 | "touch": "^3.1.0", 2729 | "undefsafe": "^2.0.5" 2730 | }, 2731 | "dependencies": { 2732 | "debug": { 2733 | "version": "3.2.7", 2734 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2735 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2736 | "dev": true, 2737 | "requires": { 2738 | "ms": "^2.1.1" 2739 | } 2740 | }, 2741 | "ms": { 2742 | "version": "2.1.3", 2743 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2744 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2745 | "dev": true 2746 | } 2747 | } 2748 | }, 2749 | "nopt": { 2750 | "version": "1.0.10", 2751 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 2752 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 2753 | "dev": true, 2754 | "requires": { 2755 | "abbrev": "1" 2756 | } 2757 | }, 2758 | "normalize-path": { 2759 | "version": "3.0.0", 2760 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2761 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 2762 | }, 2763 | "notp": { 2764 | "version": "2.0.3", 2765 | "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", 2766 | "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=" 2767 | }, 2768 | "object-assign": { 2769 | "version": "4.1.1", 2770 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2771 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2772 | }, 2773 | "object-inspect": { 2774 | "version": "1.13.1", 2775 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 2776 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" 2777 | }, 2778 | "on-finished": { 2779 | "version": "2.4.1", 2780 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2781 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2782 | "requires": { 2783 | "ee-first": "1.1.1" 2784 | } 2785 | }, 2786 | "on-headers": { 2787 | "version": "1.0.2", 2788 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 2789 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 2790 | }, 2791 | "once": { 2792 | "version": "1.4.0", 2793 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2794 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2795 | "requires": { 2796 | "wrappy": "1" 2797 | } 2798 | }, 2799 | "parseurl": { 2800 | "version": "1.3.3", 2801 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2802 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2803 | }, 2804 | "path-is-absolute": { 2805 | "version": "1.0.1", 2806 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2807 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2808 | }, 2809 | "path-to-regexp": { 2810 | "version": "0.1.7", 2811 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2812 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2813 | }, 2814 | "picomatch": { 2815 | "version": "2.3.1", 2816 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2817 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2818 | "dev": true 2819 | }, 2820 | "prettier": { 2821 | "version": "2.4.1", 2822 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", 2823 | "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", 2824 | "dev": true 2825 | }, 2826 | "printj": { 2827 | "version": "1.1.2", 2828 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", 2829 | "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" 2830 | }, 2831 | "process-nextick-args": { 2832 | "version": "2.0.1", 2833 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2834 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2835 | }, 2836 | "proxy-addr": { 2837 | "version": "2.0.7", 2838 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2839 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2840 | "requires": { 2841 | "forwarded": "0.2.0", 2842 | "ipaddr.js": "1.9.1" 2843 | } 2844 | }, 2845 | "pstree.remy": { 2846 | "version": "1.1.8", 2847 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 2848 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 2849 | "dev": true 2850 | }, 2851 | "qs": { 2852 | "version": "6.11.0", 2853 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 2854 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2855 | "requires": { 2856 | "side-channel": "^1.0.4" 2857 | } 2858 | }, 2859 | "random-bytes": { 2860 | "version": "1.0.0", 2861 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", 2862 | "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" 2863 | }, 2864 | "range-parser": { 2865 | "version": "1.2.1", 2866 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2867 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2868 | }, 2869 | "raw-body": { 2870 | "version": "2.5.2", 2871 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2872 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2873 | "requires": { 2874 | "bytes": "3.1.2", 2875 | "http-errors": "2.0.0", 2876 | "iconv-lite": "0.4.24", 2877 | "unpipe": "1.0.0" 2878 | } 2879 | }, 2880 | "readable-stream": { 2881 | "version": "3.6.0", 2882 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2883 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2884 | "requires": { 2885 | "inherits": "^2.0.3", 2886 | "string_decoder": "^1.1.1", 2887 | "util-deprecate": "^1.0.1" 2888 | } 2889 | }, 2890 | "readdir-glob": { 2891 | "version": "1.1.1", 2892 | "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", 2893 | "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", 2894 | "requires": { 2895 | "minimatch": "^3.0.4" 2896 | } 2897 | }, 2898 | "readdirp": { 2899 | "version": "3.6.0", 2900 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2901 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2902 | "dev": true, 2903 | "requires": { 2904 | "picomatch": "^2.2.1" 2905 | } 2906 | }, 2907 | "rimraf": { 2908 | "version": "3.0.2", 2909 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2910 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2911 | "requires": { 2912 | "glob": "^7.1.3" 2913 | } 2914 | }, 2915 | "safe-buffer": { 2916 | "version": "5.1.2", 2917 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2918 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2919 | }, 2920 | "safer-buffer": { 2921 | "version": "2.1.2", 2922 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2923 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2924 | }, 2925 | "semver": { 2926 | "version": "5.7.1", 2927 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2928 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2929 | "dev": true 2930 | }, 2931 | "send": { 2932 | "version": "0.18.0", 2933 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2934 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2935 | "requires": { 2936 | "debug": "2.6.9", 2937 | "depd": "2.0.0", 2938 | "destroy": "1.2.0", 2939 | "encodeurl": "~1.0.2", 2940 | "escape-html": "~1.0.3", 2941 | "etag": "~1.8.1", 2942 | "fresh": "0.5.2", 2943 | "http-errors": "2.0.0", 2944 | "mime": "1.6.0", 2945 | "ms": "2.1.3", 2946 | "on-finished": "2.4.1", 2947 | "range-parser": "~1.2.1", 2948 | "statuses": "2.0.1" 2949 | }, 2950 | "dependencies": { 2951 | "ms": { 2952 | "version": "2.1.3", 2953 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2954 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2955 | } 2956 | } 2957 | }, 2958 | "serve-static": { 2959 | "version": "1.15.0", 2960 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 2961 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2962 | "requires": { 2963 | "encodeurl": "~1.0.2", 2964 | "escape-html": "~1.0.3", 2965 | "parseurl": "~1.3.3", 2966 | "send": "0.18.0" 2967 | } 2968 | }, 2969 | "set-function-length": { 2970 | "version": "1.2.2", 2971 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 2972 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 2973 | "requires": { 2974 | "define-data-property": "^1.1.4", 2975 | "es-errors": "^1.3.0", 2976 | "function-bind": "^1.1.2", 2977 | "get-intrinsic": "^1.2.4", 2978 | "gopd": "^1.0.1", 2979 | "has-property-descriptors": "^1.0.2" 2980 | } 2981 | }, 2982 | "setprototypeof": { 2983 | "version": "1.2.0", 2984 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2985 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2986 | }, 2987 | "side-channel": { 2988 | "version": "1.0.6", 2989 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 2990 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 2991 | "requires": { 2992 | "call-bind": "^1.0.7", 2993 | "es-errors": "^1.3.0", 2994 | "get-intrinsic": "^1.2.4", 2995 | "object-inspect": "^1.13.1" 2996 | } 2997 | }, 2998 | "simple-update-notifier": { 2999 | "version": "1.1.0", 3000 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 3001 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 3002 | "dev": true, 3003 | "requires": { 3004 | "semver": "~7.0.0" 3005 | }, 3006 | "dependencies": { 3007 | "semver": { 3008 | "version": "7.0.0", 3009 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 3010 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 3011 | "dev": true 3012 | } 3013 | } 3014 | }, 3015 | "source-map": { 3016 | "version": "0.6.1", 3017 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3018 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 3019 | }, 3020 | "statuses": { 3021 | "version": "2.0.1", 3022 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 3023 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 3024 | }, 3025 | "streamsearch": { 3026 | "version": "0.1.2", 3027 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 3028 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 3029 | }, 3030 | "string_decoder": { 3031 | "version": "1.3.0", 3032 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3033 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3034 | "requires": { 3035 | "safe-buffer": "~5.2.0" 3036 | }, 3037 | "dependencies": { 3038 | "safe-buffer": { 3039 | "version": "5.2.1", 3040 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3041 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 3042 | } 3043 | } 3044 | }, 3045 | "supports-color": { 3046 | "version": "5.5.0", 3047 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3048 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3049 | "dev": true, 3050 | "requires": { 3051 | "has-flag": "^3.0.0" 3052 | } 3053 | }, 3054 | "tar-stream": { 3055 | "version": "2.2.0", 3056 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 3057 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 3058 | "requires": { 3059 | "bl": "^4.0.3", 3060 | "end-of-stream": "^1.4.1", 3061 | "fs-constants": "^1.0.0", 3062 | "inherits": "^2.0.3", 3063 | "readable-stream": "^3.1.1" 3064 | } 3065 | }, 3066 | "thirty-two": { 3067 | "version": "1.0.2", 3068 | "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", 3069 | "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=" 3070 | }, 3071 | "to-regex-range": { 3072 | "version": "5.0.1", 3073 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3074 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3075 | "dev": true, 3076 | "requires": { 3077 | "is-number": "^7.0.0" 3078 | } 3079 | }, 3080 | "toidentifier": { 3081 | "version": "1.0.1", 3082 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3083 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 3084 | }, 3085 | "touch": { 3086 | "version": "3.1.0", 3087 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 3088 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 3089 | "dev": true, 3090 | "requires": { 3091 | "nopt": "~1.0.10" 3092 | } 3093 | }, 3094 | "type-is": { 3095 | "version": "1.6.18", 3096 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3097 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3098 | "requires": { 3099 | "media-typer": "0.3.0", 3100 | "mime-types": "~2.1.24" 3101 | } 3102 | }, 3103 | "uglify-js": { 3104 | "version": "3.14.3", 3105 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", 3106 | "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", 3107 | "optional": true 3108 | }, 3109 | "uid-safe": { 3110 | "version": "2.1.5", 3111 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", 3112 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", 3113 | "requires": { 3114 | "random-bytes": "~1.0.0" 3115 | } 3116 | }, 3117 | "undefsafe": { 3118 | "version": "2.0.5", 3119 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 3120 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 3121 | "dev": true 3122 | }, 3123 | "unpipe": { 3124 | "version": "1.0.0", 3125 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3126 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 3127 | }, 3128 | "util-deprecate": { 3129 | "version": "1.0.2", 3130 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3131 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3132 | }, 3133 | "utils-merge": { 3134 | "version": "1.0.1", 3135 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3136 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3137 | }, 3138 | "vary": { 3139 | "version": "1.1.2", 3140 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3141 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3142 | }, 3143 | "wordwrap": { 3144 | "version": "1.0.0", 3145 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 3146 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 3147 | }, 3148 | "wrappy": { 3149 | "version": "1.0.2", 3150 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3151 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3152 | }, 3153 | "ws": { 3154 | "version": "8.5.0", 3155 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 3156 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 3157 | "requires": {} 3158 | }, 3159 | "xterm": { 3160 | "version": "4.15.0", 3161 | "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.15.0.tgz", 3162 | "integrity": "sha512-Ik1GoSq1yqKZQ2LF37RPS01kX9t4TP8gpamUYblD09yvWX5mEYuMK4CcqH6+plgiNEZduhTz/UrcaWs97gOlOw==" 3163 | }, 3164 | "xterm-addon-attach": { 3165 | "version": "0.6.0", 3166 | "resolved": "https://registry.npmjs.org/xterm-addon-attach/-/xterm-addon-attach-0.6.0.tgz", 3167 | "integrity": "sha512-Mo8r3HTjI/EZfczVCwRU6jh438B4WLXxdFO86OB7bx0jGhwh2GdF4ifx/rP+OB+Cb2vmLhhVIZ00/7x3YSP3dg==", 3168 | "requires": {} 3169 | }, 3170 | "xterm-addon-fit": { 3171 | "version": "0.5.0", 3172 | "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz", 3173 | "integrity": "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==", 3174 | "requires": {} 3175 | }, 3176 | "zip-stream": { 3177 | "version": "4.1.0", 3178 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", 3179 | "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", 3180 | "requires": { 3181 | "archiver-utils": "^2.1.0", 3182 | "compress-commons": "^4.1.0", 3183 | "readable-stream": "^3.6.0" 3184 | } 3185 | } 3186 | } 3187 | } 3188 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "file-manager", 3 | "description": "A simple file manager", 4 | "version": "0.2.4", 5 | "scripts": { 6 | "format": "prettier --write .", 7 | "start": "node index.js", 8 | "dev": "nodemon index.js" 9 | }, 10 | "bin": { 11 | "file-manager": "index.js" 12 | }, 13 | "dependencies": { 14 | "@primer/octicons": "^16.1.1", 15 | "archiver": "^5.3.0", 16 | "bootstrap": "^5.0.0", 17 | "connect-busboy": "^0.0.2", 18 | "connect-flash": "^0.1.1", 19 | "express": "^4.19.2", 20 | "express-handlebars": "^6.0.1", 21 | "express-session": "^1.17.2", 22 | "filesize": "^8.0.6", 23 | "jquery": "^3.6.0", 24 | "node-pty": "^0.10.1", 25 | "notp": "^2.0.3", 26 | "rimraf": "^3.0.2", 27 | "thirty-two": "^1.0.2", 28 | "ws": "^8.5.0", 29 | "xterm": "^4.15.0", 30 | "xterm-addon-attach": "^0.6.0", 31 | "xterm-addon-fit": "^0.5.0" 32 | }, 33 | "devDependencies": { 34 | "nodemon": "^2.0.20", 35 | "prettier": "^2.4.1" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /views/cmd.handlebars: -------------------------------------------------------------------------------- 1 | {{> navbar}} 2 | 3 |
    4 |
    5 | {{#each errors as |error|}} 6 | 9 | {{/each}} 10 | {{#each successes as |success|}} 11 | 14 | {{/each}} 15 |

    command

    16 |

    {{cmd}}

    17 |

    stdout

    18 |
    {{stdout}}
    19 |

    stderr

    20 |
    {{stderr}}
    21 |
    22 |
    23 | 24 | 40 | 41 | {{> dialogue-cmd}} 42 | -------------------------------------------------------------------------------- /views/layouts/main.handlebars: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | File Manager 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | {{{body}}} 43 | 44 | 45 | -------------------------------------------------------------------------------- /views/list.handlebars: -------------------------------------------------------------------------------- 1 | {{> navbar path=path}} 2 | 3 |
    4 |
    5 |
    6 |
    7 | {{#each errors as |error|}} 8 | 11 | {{/each}} 12 | {{#each successes as |success|}} 13 | 16 | {{/each}} 17 |
      18 | {{#each files}} 19 |
    • 20 | 41 |
    • 42 | {{else}} 43 |
    • 44 | No files 45 |
    • 46 | {{/each}} 47 |
    48 |
    49 |
    50 |
    51 |
    52 | 53 | {{> toolbar shellable=shellable cmdable=cmdable}} 54 | 55 | {{> dialogue-upload}} 56 | {{> dialogue-mkdir}} 57 | {{> dialogue-cmd}} 58 | 59 | {{> dialogue-download}} 60 | {{> dialogue-rename}} 61 | {{> dialogue-delete}} 62 | -------------------------------------------------------------------------------- /views/login.handlebars: -------------------------------------------------------------------------------- 1 | {{> navbar isloggingin=true}} 2 | 3 |
    4 |
    5 | 31 |
    32 |
    33 | -------------------------------------------------------------------------------- /views/partials/dialogue-cmd.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 19 |
    20 | -------------------------------------------------------------------------------- /views/partials/dialogue-delete.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 23 |
    24 | -------------------------------------------------------------------------------- /views/partials/dialogue-download.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 27 |
    28 | -------------------------------------------------------------------------------- /views/partials/dialogue-mkdir.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 19 |
    20 | -------------------------------------------------------------------------------- /views/partials/dialogue-rename.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 22 |
    23 | -------------------------------------------------------------------------------- /views/partials/dialogue-upload.handlebars: -------------------------------------------------------------------------------- 1 |
    2 | 27 |
    28 | -------------------------------------------------------------------------------- /views/partials/navbar.handlebars: -------------------------------------------------------------------------------- 1 | 29 | -------------------------------------------------------------------------------- /views/partials/toolbar.handlebars: -------------------------------------------------------------------------------- 1 | 59 | -------------------------------------------------------------------------------- /views/shell.handlebars: -------------------------------------------------------------------------------- 1 | {{> navbar}} 2 | 3 |
    4 |
    5 |
    6 | 7 | 23 | --------------------------------------------------------------------------------