├── public
├── _redirects
├── favicon.ico
├── logo512.png
├── robots.txt
├── favicon-16x16.png
├── favicon-32x32.png
├── mstile-150x150.png
├── apple-touch-icon.png
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── github-social-preview.png
├── browserconfig.xml
├── site.webmanifest
├── manifest.json
├── safari-pinned-tab.svg
└── index.html
├── screenshots
├── home.png
├── codebox.png
├── notifications.png
└── full-size
│ ├── coderigade.netlify.app_.png
│ ├── coderigade.netlify.app_codebox_room=1590818009213.png
│ └── coderigade.netlify.app_codebox_room=1590819581481.png
├── design
├── feature-graphic.png
└── codeRigadeIcon.sketch
├── src
├── components
│ ├── User
│ │ ├── User.js
│ │ └── User.scss
│ ├── Header
│ │ ├── Header.js
│ │ └── Header.scss
│ ├── UsersList
│ │ ├── UsersList.scss
│ │ └── UsersList.js
│ ├── ControlDropdown
│ │ ├── ControlDropdown.js
│ │ └── ControlDropdown.scss
│ ├── Login
│ │ ├── Login.js
│ │ └── Login.scss
│ └── Codebox
│ │ ├── Codebox.scss
│ │ └── Codebox.js
├── index.scss
├── index.js
├── App.js
└── serviceWorker.js
├── server
├── README.md
├── package.json
├── users.js
├── index.js
└── package-lock.json
├── .gitignore
├── LICENSE
├── package.json
├── README.md
└── CONTRIBUTING.md
/public/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/screenshots/home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/screenshots/home.png
--------------------------------------------------------------------------------
/screenshots/codebox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/screenshots/codebox.png
--------------------------------------------------------------------------------
/design/feature-graphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/design/feature-graphic.png
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/mstile-150x150.png
--------------------------------------------------------------------------------
/design/codeRigadeIcon.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/design/codeRigadeIcon.sketch
--------------------------------------------------------------------------------
/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/screenshots/notifications.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/screenshots/notifications.png
--------------------------------------------------------------------------------
/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/public/github-social-preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/public/github-social-preview.png
--------------------------------------------------------------------------------
/screenshots/full-size/coderigade.netlify.app_.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/screenshots/full-size/coderigade.netlify.app_.png
--------------------------------------------------------------------------------
/screenshots/full-size/coderigade.netlify.app_codebox_room=1590818009213.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/screenshots/full-size/coderigade.netlify.app_codebox_room=1590818009213.png
--------------------------------------------------------------------------------
/screenshots/full-size/coderigade.netlify.app_codebox_room=1590819581481.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abhishekashyap/codeRigade/HEAD/screenshots/full-size/coderigade.netlify.app_codebox_room=1590819581481.png
--------------------------------------------------------------------------------
/src/components/User/User.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./User.scss"
3 |
4 | export default function User({ user }) {
5 | return (
6 |
7 |
8 | {user.name}
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/src/components/Header/Header.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./Header.scss";
3 |
4 | export default function Header() {
5 | return (
6 |
7 | CodeRigade
8 | Real-time collaborative code editor
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/public/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #2d89ef
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/components/UsersList/UsersList.scss:
--------------------------------------------------------------------------------
1 | .users {
2 | display: flex;
3 | flex-wrap: wrap;
4 | justify-content: center;
5 | font-size: 0.9em;
6 | margin-top: 3%;
7 | margin-bottom: 20px;
8 | cursor: default;
9 |
10 | @media screen and (max-width: 800px) {
11 | font-size: 0.6em;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/server/README.md:
--------------------------------------------------------------------------------
1 | # CodeRigade Server
2 |
3 | This is socket.io server for CodeRigade
4 |
5 | ### Buildpack
6 |
7 | ```
8 | https://github.com/timanovsky/subdir-heroku-buildpack
9 | ```
10 |
11 | ### Automatic heroku subdir deploy info
12 |
13 | ```
14 | https://stackoverflow.com/questions/39197334/automated-heroku-deploy-from-subfolder
15 | ```
--------------------------------------------------------------------------------
/src/components/User/User.scss:
--------------------------------------------------------------------------------
1 | .user {
2 | display: flex;
3 | background-color: #bdc3c7;
4 | border-radius: 5px;
5 | padding: 10px;
6 | margin: 5px;
7 | span {
8 | // Online icon
9 | align-self: center;
10 | border: 4px solid transparent;
11 | border-color: #2ecc71;
12 | border-radius: 100px;
13 | font-size: 0;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/index.scss:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Montserrat&display=swap");
2 |
3 | * {
4 | padding: 0;
5 | margin: 0;
6 | box-sizing: border-box;
7 | }
8 |
9 | html,
10 | body,
11 | #root {
12 | // #root is the React root div
13 | height: 100%;
14 | background-color: #2c3338;
15 | font-family: "Montserrat", sans-serif;
16 | }
17 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.scss'
4 | import App from './App';
5 | import * as serviceWorker from './serviceWorker';
6 |
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById('root')
12 | );
13 |
14 | serviceWorker.unregister();
15 |
--------------------------------------------------------------------------------
/src/components/UsersList/UsersList.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./UsersList.scss";
3 |
4 | import User from "../User/User";
5 |
6 | export default function UsersList({ users }) {
7 | return (
8 |
9 | {users &&
10 | users.map((user) => (
11 |
12 | ))}
13 |
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/src/components/Header/Header.scss:
--------------------------------------------------------------------------------
1 | header {
2 | margin-top: 3rem;
3 | h1 {
4 | text-align: center;
5 | font-size: 3.2em;
6 | color: #f0f0f0;
7 | @media screen and (max-width: 800px) {
8 | font-size: 2.4em;
9 | }
10 | }
11 | h5 {
12 | text-align: center;
13 | font-size: 1.5em;
14 | color: #fc5185;
15 | @media screen and (max-width: 800px) {
16 | font-size: 1em;
17 | margin-bottom: 5%;
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js",
8 | "dev": "nodemon"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "devDependencies": {
14 | "nodemon": "^2.0.4"
15 | },
16 | "dependencies": {
17 | "cors": "^2.8.5",
18 | "express": "^4.17.1",
19 | "socket.io": "^2.3.0"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/components/ControlDropdown/ControlDropdown.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./ControlDropdown.scss";
3 |
4 | export default function ControlDropdown(props) {
5 | return (
6 |
7 |
8 | {props.options.map((option) => (
9 | {option.name}
10 | ))}
11 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/public/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "",
3 | "short_name": "",
4 | "icons": [
5 | {
6 | "src": "/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/android-chrome-512x512.png",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/src/components/ControlDropdown/ControlDropdown.scss:
--------------------------------------------------------------------------------
1 | .control-dropdown {
2 | display: flex;
3 | align-items: center;
4 | flex: 1;
5 | background-color: #13866f;
6 | padding: 0 1% 0 1%;
7 | select {
8 | width: 100%;
9 | outline-color: #fc5185;
10 | appearance: none;
11 | background-color: #13866f;
12 | color: #fff;
13 | font-size: inherit;
14 | padding: 0.5em;
15 | border: none;
16 | transition: 0.2s ease;
17 | &:hover {
18 | background-color: #145f50;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CodeRigade - Realtime collaborative code editor",
3 | "short_name": "CodeRigade",
4 | "icons": [
5 | {
6 | "src": "/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/android-chrome-512x512.png",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "start_url": ".",
17 | "theme_color": "#ffffff",
18 | "background_color": "#ffffff",
19 | "display": "standalone"
20 | }
21 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
3 | import ReactNotification from "react-notifications-component";
4 | import 'react-notifications-component/dist/theme.css'
5 |
6 | import Login from "./components/Login/Login";
7 | import Codebox from "./components/Codebox/Codebox";
8 |
9 | function App() {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | );
19 | }
20 |
21 | export default App;
22 |
--------------------------------------------------------------------------------
/server/users.js:
--------------------------------------------------------------------------------
1 | const users = [];
2 |
3 | const addUser = ({ id, name, room }) => {
4 | if (name) {
5 | // If name is defined, add the user
6 | name = name.trim();
7 | const user = { id, name, room };
8 | users.push(user);
9 | return { user };
10 | } else {
11 | return { error: "Enter a valid name" };
12 | }
13 | };
14 |
15 | const removeUser = (id) => {
16 | const index = users.findIndex((user) => user.id === id);
17 | if (index !== -1) {
18 | return users.splice(index, 1)[0];
19 | }
20 | };
21 |
22 | const findUser = (id) => users.find((user) => user.id === id);
23 |
24 | const usersInRoom = (room) => users.filter((user) => user.room === room);
25 |
26 | module.exports = { addUser, removeUser, findUser, usersInRoom };
27 |
--------------------------------------------------------------------------------
/src/components/Login/Login.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./Login.scss";
3 | import Header from "../Header/Header";
4 |
5 | export default function Login(props) {
6 | const handleSubmit = (e) => {
7 | e.preventDefault();
8 | const room = new Date().getTime(); // Generating random room code
9 | props.history.push(`/codebox?room=${room}`);
10 | };
11 |
12 | return (
13 |
14 |
15 |
16 |
17 |
24 |
25 |
26 |
29 |
30 |
31 |
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/src/components/Codebox/Codebox.scss:
--------------------------------------------------------------------------------
1 | .codebox-container {
2 | display: flex;
3 | flex: 1;
4 | justify-content: space-between;
5 | flex-direction: column;
6 | height: 100%;
7 |
8 | main {
9 | display: flex;
10 | height: 90%;
11 | flex-direction: column;
12 | margin-top: 1%;
13 | align-items: center;
14 | }
15 |
16 | .controls {
17 | display: flex;
18 | justify-content: space-around;
19 | align-content: space-around;
20 | background-color: #2ecc71;
21 | height: 6%;
22 | width: 90%;
23 | overflow-y: scroll;
24 | }
25 |
26 | .control-icon {
27 | cursor: pointer;
28 | color: #fff;
29 | display: flex;
30 | flex: 1;
31 | align-items: center;
32 | justify-content: center;
33 | background-color: #2980b9;
34 | transition: 0.2s ease;
35 | &:hover {
36 | background-color: #1574b4;
37 | }
38 | }
39 |
40 | // Overriding the main codemirror css
41 | .CodeMirror {
42 | height: 500px;
43 | }
44 |
45 | .code-editor {
46 | width: 90%;
47 | font-size: 1.3em;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Abhishek Kashyap
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 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "livecode",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^4.2.4",
7 | "@testing-library/react": "^9.3.2",
8 | "@testing-library/user-event": "^7.1.2",
9 | "codemirror": "^5.58.2",
10 | "node-sass": "^7.0.0",
11 | "query-string": "^6.12.1",
12 | "react": "^16.13.1",
13 | "react-codemirror2": "^7.2.0",
14 | "react-dom": "^16.13.1",
15 | "react-icons": "^3.10.0",
16 | "react-notifications-component": "^2.4.0",
17 | "react-router-dom": "^5.2.0",
18 | "react-scripts": "3.4.1",
19 | "socket.io-client": "^2.3.0"
20 | },
21 | "scripts": {
22 | "start": "react-scripts start",
23 | "build": "react-scripts build",
24 | "test": "react-scripts test",
25 | "eject": "react-scripts eject"
26 | },
27 | "eslintConfig": {
28 | "extends": "react-app"
29 | },
30 | "browserslist": {
31 | "production": [
32 | ">0.2%",
33 | "not dead",
34 | "not op_mini all"
35 | ],
36 | "development": [
37 | "last 1 chrome version",
38 | "last 1 firefox version",
39 | "last 1 safari version"
40 | ]
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/components/Login/Login.scss:
--------------------------------------------------------------------------------
1 | .login-container {
2 | display: flex;
3 | flex-direction: column;
4 | height: 100%;
5 | align-items: center;
6 |
7 |
8 |
9 | main {
10 | display: flex;
11 | width: 100%;
12 | flex-direction: column;
13 | align-items: center;
14 | }
15 |
16 | .animation {
17 | width: 30%;
18 | @media screen and (max-width: 800px) {
19 | width: 70%;
20 | }
21 | }
22 |
23 | .btn-container {
24 | margin: auto;
25 | width: 20%;
26 | @media screen and (max-width: 800px) {
27 | width: 70%;
28 | }
29 | }
30 |
31 | form {
32 | display: flex;
33 | flex-direction: column;
34 | width: 100%;
35 |
36 | input {
37 | flex: 1;
38 | border: none;
39 | border-radius: 5px;
40 | padding: 5%;
41 | font-size: 1.4em;
42 | color: #f0f0f0;
43 | outline-color: #fc5185;
44 | background-color: #fc5185;
45 | transition: 0.2s ease;
46 | // margin-top: 10%;
47 | &:hover {
48 | background-color: #ff4079;
49 | cursor: pointer;
50 | }
51 | &:active {
52 | background-color: #fd709a;
53 | }
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | [](https://app.netlify.com/sites/coderigade/deploys)
3 |
4 | CodeRigade is a realtime collaborative code editor.
5 |
6 | [View live version](https://coderigade.netlify.app/)
7 |
8 | ## Getting Started
9 |
10 | ### Setting up frontend
11 |
12 | ```bash
13 | npm install #Installing dependencies
14 | npm start #Starting dev server
15 | ```
16 |
17 | ### Setting up backend
18 |
19 | ```bash
20 | cd server #Change directory to server
21 | npm install #Installing dependencies
22 | npm run dev #Starting dev server
23 | ```
24 |
25 | ## Screenshots
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | ## Built With
34 |
35 | - [ReactJS](https://reactjs.org/) - A JavaScript library for building user interfaces
36 | - [CodeMirror](https://codemirror.net/) - CodeMirror is a versatile text editor implemented in JavaScript for the browser.
37 | - [NodeJS](https://nodejs.org/) - Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
38 | - [Socket.io](https://socket.io/) - Socket.IO enables real-time, bidirectional and event-based communication.
39 |
40 | ## Contributing
41 |
42 | Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on code of conduct, and the process for submitting pull requests to me.
43 |
44 | ## Authors
45 |
46 | - **Abhishek Kashyap** - _Initial work_ - [abhishekashyap](https://github.com/abhishekashyap)
47 |
48 | ## License
49 |
50 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | const app = require("express")();
2 | const http = require("http").createServer(app);
3 | const io = require("socket.io")(http);
4 | const cors = require("cors");
5 | const PORT = process.env.PORT || 5000;
6 |
7 | const { addUser, removeUser, findUser, usersInRoom } = require("./users");
8 |
9 | app.use(cors());
10 |
11 | app.get("/", (req, res) => {
12 | res.send("Welcome to CodeRigade server ");
13 | });
14 |
15 | io.on("connection", (socket) => {
16 | socket.on("join", ({ name, room }, callback) => {
17 | console.log("User has joined");
18 | const { error, user } = addUser({ id: socket.id, name, room });
19 |
20 | if (error) {
21 | return callback(error);
22 | } else {
23 | socket.join(user.room);
24 | console.log("user id", socket.id);
25 |
26 | // For notifications
27 | socket.broadcast.to(user.room).emit("notification", {
28 | text: `${user.name} has joined!`,
29 | type: "connect",
30 | });
31 |
32 | io.to(user.room).emit("roomData", {
33 | room: user.room,
34 | users: usersInRoom(user.room),
35 | });
36 |
37 | callback();
38 | }
39 | });
40 |
41 | socket.on("sendText", (text) => {
42 | const user = findUser(socket.id);
43 | console.log(text);
44 | socket.broadcast.to(user.room).emit("text", text);
45 | });
46 |
47 | socket.on("sendModeValue", (mode) => {
48 | const user = findUser(socket.id);
49 | socket.broadcast.to(user.room).emit("changeMode", mode);
50 | });
51 |
52 | socket.on("sendThemeValue", (theme) => {
53 | const user = findUser(socket.id);
54 | console.log("user room code", user.room);
55 | socket.broadcast.to(user.room).emit("changeTheme", theme);
56 | });
57 |
58 | socket.on("disconnect", () => {
59 | console.log("User has disconnected");
60 | const user = removeUser(socket.id);
61 | if (user) {
62 | io.to(user.room).emit("notification", {
63 | text: `${user.name} has left`,
64 | type: "disconnect",
65 | });
66 |
67 | io.to(user.room).emit("roomData", {
68 | room: user.room,
69 | users: usersInRoom(user.room),
70 | });
71 | }
72 | });
73 | });
74 |
75 | http.listen(PORT, () => {
76 | console.log(`Listening on port ${PORT}`);
77 | });
78 |
--------------------------------------------------------------------------------
/public/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 | Created by potrace 1.11, written by Peter Selinger 2001-2013
9 |
10 |
12 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | CodeRigade
15 |
16 |
20 |
21 |
22 |
23 |
24 |
28 |
32 |
33 |
34 |
35 |
36 |
37 |
41 |
45 |
49 |
58 |
59 |
60 | You need to enable JavaScript to run this app.
61 |
62 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | When contributing to this repository, please first discuss the change you wish to make via issue,
4 | email, or any other method with the owners of this repository before making a change.
5 |
6 | Please note we have a code of conduct, please follow it in all your interactions with the project.
7 |
8 | ## Pull Request Process
9 |
10 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a
11 | build.
12 | 2. Update the README.md with details of changes to the interface, this includes new environment
13 | variables, exposed ports, useful file locations and container parameters.
14 |
15 | ## Code of Conduct
16 |
17 | ### Our Pledge
18 |
19 | In the interest of fostering an open and welcoming environment, we as
20 | contributors and maintainers pledge to making participation in our project and
21 | our community a harassment-free experience for everyone, regardless of age, body
22 | size, disability, ethnicity, gender identity and expression, level of experience,
23 | nationality, personal appearance, race, religion, or sexual identity and
24 | orientation.
25 |
26 | ### Our Standards
27 |
28 | Examples of behavior that contributes to creating a positive environment
29 | include:
30 |
31 | - Using welcoming and inclusive language
32 | - Being respectful of differing viewpoints and experiences
33 | - Gracefully accepting constructive criticism
34 | - Focusing on what is best for the community
35 | - Showing empathy towards other community members
36 |
37 | Examples of unacceptable behavior by participants include:
38 |
39 | - The use of sexualized language or imagery and unwelcome sexual attention or
40 | advances
41 | - Trolling, insulting/derogatory comments, and personal or political attacks
42 | - Public or private harassment
43 | - Publishing others' private information, such as a physical or electronic
44 | address, without explicit permission
45 | - Other conduct which could reasonably be considered inappropriate in a
46 | professional setting
47 |
48 | ### Our Responsibilities
49 |
50 | Project maintainers are responsible for clarifying the standards of acceptable
51 | behavior and are expected to take appropriate and fair corrective action in
52 | response to any instances of unacceptable behavior.
53 |
54 | Project maintainers have the right and responsibility to remove, edit, or
55 | reject comments, commits, code, wiki edits, issues, and other contributions
56 | that are not aligned to this Code of Conduct, or to ban temporarily or
57 | permanently any contributor for other behaviors that they deem inappropriate,
58 | threatening, offensive, or harmful.
59 |
60 | ### Scope
61 |
62 | This Code of Conduct applies both within project spaces and in public spaces
63 | when an individual is representing the project or its community. Examples of
64 | representing a project or community include using an official project e-mail
65 | address, posting via an official social media account, or acting as an appointed
66 | representative at an online or offline event. Representation of a project may be
67 | further defined and clarified by project maintainers.
68 |
69 | ### Enforcement
70 |
71 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
72 | reported by contacting the project team. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
73 |
74 | Project maintainers who do not follow or enforce the Code of Conduct in good
75 | faith may face temporary or permanent repercussions as determined by other
76 | members of the project's leadership.
77 |
78 | ### Attribution
79 |
80 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
81 | available at [http://contributor-covenant.org/version/1/4][version]
82 |
83 | [homepage]: http://contributor-covenant.org
84 | [version]: http://contributor-covenant.org/version/1/4/
--------------------------------------------------------------------------------
/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.0/8 are considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl, {
104 | headers: { 'Service-Worker': 'script' },
105 | })
106 | .then(response => {
107 | // Ensure service worker exists, and that we really are getting a JS file.
108 | const contentType = response.headers.get('content-type');
109 | if (
110 | response.status === 404 ||
111 | (contentType != null && contentType.indexOf('javascript') === -1)
112 | ) {
113 | // No service worker found. Probably a different app. Reload the page.
114 | navigator.serviceWorker.ready.then(registration => {
115 | registration.unregister().then(() => {
116 | window.location.reload();
117 | });
118 | });
119 | } else {
120 | // Service worker found. Proceed as normal.
121 | registerValidSW(swUrl, config);
122 | }
123 | })
124 | .catch(() => {
125 | console.log(
126 | 'No internet connection found. App is running in offline mode.'
127 | );
128 | });
129 | }
130 |
131 | export function unregister() {
132 | if ('serviceWorker' in navigator) {
133 | navigator.serviceWorker.ready
134 | .then(registration => {
135 | registration.unregister();
136 | })
137 | .catch(error => {
138 | console.error(error.message);
139 | });
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/src/components/Codebox/Codebox.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { Controlled as CodeMirror } from "react-codemirror2";
3 | import { FiShare2 } from "react-icons/fi";
4 | import io from "socket.io-client";
5 | import queryString from "query-string";
6 | import { store } from "react-notifications-component";
7 |
8 | // Components
9 | import Header from "../Header/Header";
10 | import UsersList from "../UsersList/UsersList";
11 |
12 | // The following imports is for the theme.
13 | import "codemirror/lib/codemirror.css";
14 |
15 | // Themes
16 | import "codemirror/theme/material.css";
17 | import "codemirror/theme/monokai.css";
18 | import "codemirror/theme/nord.css";
19 | import "codemirror/theme/ambiance.css";
20 | import "codemirror/theme/eclipse.css";
21 |
22 | // Languages
23 | // LAZY LOAD THESE IMPORTS
24 | import "codemirror/mode/xml/xml";
25 | import "codemirror/mode/javascript/javascript";
26 | import "codemirror/mode/clike/clike";
27 | import "codemirror/mode/css/css";
28 | import "codemirror/mode/python/python";
29 | import "codemirror/mode/php/php";
30 | import "codemirror/mode/vue/vue";
31 |
32 | // Overrides some codemirror classes, don't change order
33 | import "./Codebox.scss";
34 | import ControlDropdown from "../ControlDropdown/ControlDropdown";
35 |
36 | let socket;
37 |
38 | export default function Codebox({ location }) {
39 | const [name, setName] = useState("");
40 | const [room, setRoom] = useState("");
41 | const [users, setUsers] = useState("");
42 | const [text, setText] = useState("Welcome to CodeRigade ");
43 | const [config, setConfig] = useState({
44 | mode: { name: "xml" },
45 | theme: "material",
46 | lineNumbers: true,
47 | });
48 |
49 | const ENDPOINT = "https://coderigade.herokuapp.com/";
50 |
51 | useEffect(() => {
52 | const { room } = queryString.parse(location.search);
53 |
54 | socket = io(ENDPOINT);
55 |
56 | let name;
57 | while (!name) {
58 | // While name is undefined
59 | name = prompt("Hi, What is your name?");
60 | }
61 |
62 | setName(name);
63 | setRoom(room);
64 |
65 | // Initial connection to the room
66 | socket.emit("join", { name, room }, (error) => {
67 | if (error) {
68 | alert(error);
69 | }
70 | });
71 | }, [ENDPOINT, location.search]);
72 |
73 | // Socket.io listeners
74 | useEffect(() => {
75 | socket.on("text", (text) => {
76 | setText(text);
77 | });
78 |
79 | socket.on("notification", (notification) => {
80 | if (notification.type === "connect") {
81 | store.addNotification({
82 | message: notification.text,
83 | type: "success",
84 | insert: "top",
85 | container: "top-right",
86 | animationIn: ["animated", "fadeIn"],
87 | animationOut: ["animated", "fadeOut"],
88 | dismiss: {
89 | duration: 5000,
90 | onScreen: true,
91 | pauseOnHover: true,
92 | touch: true,
93 | showIcon: true,
94 | click: true,
95 | },
96 | });
97 | } else {
98 | store.addNotification({
99 | message: notification.text,
100 | type: "danger",
101 | insert: "top",
102 | container: "top-right",
103 | animationIn: ["animated", "fadeIn"],
104 | animationOut: ["animated", "fadeOut"],
105 | dismiss: {
106 | duration: 5000,
107 | onScreen: true,
108 | pauseOnHover: true,
109 | touch: true,
110 | showIcon: true,
111 | click: true,
112 | },
113 | });
114 | }
115 | });
116 |
117 | socket.on("changeMode", (mode) => {
118 | setConfig({ mode: mode });
119 | });
120 |
121 | socket.on("changeTheme", (theme) => {
122 | setConfig({ theme: theme });
123 | });
124 |
125 | socket.on("roomData", ({ users }) => {
126 | setUsers(users);
127 | console.log(users);
128 | });
129 | }, []);
130 |
131 | const handleChange = (value) => {
132 | socket.emit("sendText", value);
133 | };
134 |
135 | const handleMode = (e) => {
136 | setConfig({ mode: e.target.value });
137 | socket.emit("sendModeValue", e.target.value);
138 | };
139 |
140 | const handleTheme = (e) => {
141 | setConfig({ theme: e.target.value });
142 | socket.emit("sendThemeValue", e.target.value);
143 | };
144 |
145 | const handleShare = () => {
146 | navigator.clipboard.writeText(window.location.href);
147 | store.addNotification({
148 | message: "Copied shareable link to clipboard!",
149 | type: "info",
150 | insert: "top",
151 | container: "top-right",
152 | animationIn: ["animated", "fadeIn"],
153 | animationOut: ["animated", "fadeOut"],
154 | dismiss: {
155 | duration: 5000,
156 | onScreen: true,
157 | pauseOnHover: true,
158 | touch: true,
159 | showIcon: true,
160 | click: true,
161 | },
162 | });
163 | };
164 |
165 | const modes = [
166 | { name: "XML/HTML", code: "xml" },
167 | { name: "CSS", code: "css" },
168 | { name: "Javascript", code: "javascript" },
169 | { name: "C/C++/C#", code: "clike" },
170 | { name: "Python", code: "python" },
171 | { name: "PHP", code: "php" },
172 | { name: "Vue", code: "vue" },
173 | ];
174 |
175 | const themes = [
176 | { name: "Material", code: "material" },
177 | { name: "Monokai", code: "monokai" },
178 | { name: "Nord", code: "nord" },
179 | { name: "Ambiance", code: "ambiance" },
180 | { name: "Eclipse", code: "eclipse" },
181 | ];
182 |
183 | return (
184 |
185 |
186 |
187 |
188 |
189 |
194 |
195 | Share
196 |
197 |
198 |
203 |
204 | {
209 | setText(value);
210 | handleChange(value);
211 | }}
212 | />
213 |
214 |
215 | );
216 | }
217 |
--------------------------------------------------------------------------------
/server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@sindresorhus/is": {
8 | "version": "0.14.0",
9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
11 | "dev": true
12 | },
13 | "@szmarczak/http-timer": {
14 | "version": "1.1.2",
15 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
16 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
17 | "dev": true,
18 | "requires": {
19 | "defer-to-connect": "^1.0.1"
20 | }
21 | },
22 | "@types/color-name": {
23 | "version": "1.1.1",
24 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
25 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
26 | "dev": true
27 | },
28 | "abbrev": {
29 | "version": "1.1.1",
30 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
31 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
32 | "dev": true
33 | },
34 | "accepts": {
35 | "version": "1.3.7",
36 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
37 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
38 | "requires": {
39 | "mime-types": "~2.1.24",
40 | "negotiator": "0.6.2"
41 | }
42 | },
43 | "after": {
44 | "version": "0.8.2",
45 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
46 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
47 | },
48 | "ansi-align": {
49 | "version": "3.0.0",
50 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
51 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
52 | "dev": true,
53 | "requires": {
54 | "string-width": "^3.0.0"
55 | },
56 | "dependencies": {
57 | "string-width": {
58 | "version": "3.1.0",
59 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
60 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
61 | "dev": true,
62 | "requires": {
63 | "emoji-regex": "^7.0.1",
64 | "is-fullwidth-code-point": "^2.0.0",
65 | "strip-ansi": "^5.1.0"
66 | }
67 | }
68 | }
69 | },
70 | "ansi-regex": {
71 | "version": "4.1.1",
72 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
73 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
74 | "dev": true
75 | },
76 | "ansi-styles": {
77 | "version": "4.2.1",
78 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
79 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
80 | "dev": true,
81 | "requires": {
82 | "@types/color-name": "^1.1.1",
83 | "color-convert": "^2.0.1"
84 | }
85 | },
86 | "anymatch": {
87 | "version": "3.1.1",
88 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
89 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
90 | "dev": true,
91 | "requires": {
92 | "normalize-path": "^3.0.0",
93 | "picomatch": "^2.0.4"
94 | }
95 | },
96 | "array-flatten": {
97 | "version": "1.1.1",
98 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
99 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
100 | },
101 | "arraybuffer.slice": {
102 | "version": "0.0.7",
103 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
104 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
105 | },
106 | "backo2": {
107 | "version": "1.0.2",
108 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
109 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
110 | },
111 | "balanced-match": {
112 | "version": "1.0.0",
113 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
114 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
115 | "dev": true
116 | },
117 | "base64-arraybuffer": {
118 | "version": "0.1.4",
119 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
120 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
121 | },
122 | "base64id": {
123 | "version": "2.0.0",
124 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
125 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
126 | },
127 | "binary-extensions": {
128 | "version": "2.0.0",
129 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
130 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
131 | "dev": true
132 | },
133 | "blob": {
134 | "version": "0.0.5",
135 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
136 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
137 | },
138 | "body-parser": {
139 | "version": "1.19.2",
140 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
141 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
142 | "requires": {
143 | "bytes": "3.1.2",
144 | "content-type": "~1.0.4",
145 | "debug": "2.6.9",
146 | "depd": "~1.1.2",
147 | "http-errors": "1.8.1",
148 | "iconv-lite": "0.4.24",
149 | "on-finished": "~2.3.0",
150 | "qs": "6.9.7",
151 | "raw-body": "2.4.3",
152 | "type-is": "~1.6.18"
153 | },
154 | "dependencies": {
155 | "debug": {
156 | "version": "2.6.9",
157 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
158 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
159 | "requires": {
160 | "ms": "2.0.0"
161 | }
162 | },
163 | "ms": {
164 | "version": "2.0.0",
165 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
166 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
167 | }
168 | }
169 | },
170 | "boxen": {
171 | "version": "4.2.0",
172 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
173 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
174 | "dev": true,
175 | "requires": {
176 | "ansi-align": "^3.0.0",
177 | "camelcase": "^5.3.1",
178 | "chalk": "^3.0.0",
179 | "cli-boxes": "^2.2.0",
180 | "string-width": "^4.1.0",
181 | "term-size": "^2.1.0",
182 | "type-fest": "^0.8.1",
183 | "widest-line": "^3.1.0"
184 | }
185 | },
186 | "brace-expansion": {
187 | "version": "1.1.11",
188 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
189 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
190 | "dev": true,
191 | "requires": {
192 | "balanced-match": "^1.0.0",
193 | "concat-map": "0.0.1"
194 | }
195 | },
196 | "braces": {
197 | "version": "3.0.2",
198 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
199 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
200 | "dev": true,
201 | "requires": {
202 | "fill-range": "^7.0.1"
203 | }
204 | },
205 | "bytes": {
206 | "version": "3.1.2",
207 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
208 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
209 | },
210 | "cacheable-request": {
211 | "version": "6.1.0",
212 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
213 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
214 | "dev": true,
215 | "requires": {
216 | "clone-response": "^1.0.2",
217 | "get-stream": "^5.1.0",
218 | "http-cache-semantics": "^4.0.0",
219 | "keyv": "^3.0.0",
220 | "lowercase-keys": "^2.0.0",
221 | "normalize-url": "^4.1.0",
222 | "responselike": "^1.0.2"
223 | },
224 | "dependencies": {
225 | "get-stream": {
226 | "version": "5.1.0",
227 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
228 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
229 | "dev": true,
230 | "requires": {
231 | "pump": "^3.0.0"
232 | }
233 | },
234 | "lowercase-keys": {
235 | "version": "2.0.0",
236 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
237 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
238 | "dev": true
239 | }
240 | }
241 | },
242 | "camelcase": {
243 | "version": "5.3.1",
244 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
245 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
246 | "dev": true
247 | },
248 | "chalk": {
249 | "version": "3.0.0",
250 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
251 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
252 | "dev": true,
253 | "requires": {
254 | "ansi-styles": "^4.1.0",
255 | "supports-color": "^7.1.0"
256 | },
257 | "dependencies": {
258 | "has-flag": {
259 | "version": "4.0.0",
260 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
261 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
262 | "dev": true
263 | },
264 | "supports-color": {
265 | "version": "7.1.0",
266 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
267 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
268 | "dev": true,
269 | "requires": {
270 | "has-flag": "^4.0.0"
271 | }
272 | }
273 | }
274 | },
275 | "chokidar": {
276 | "version": "3.4.0",
277 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz",
278 | "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==",
279 | "dev": true,
280 | "requires": {
281 | "anymatch": "~3.1.1",
282 | "braces": "~3.0.2",
283 | "fsevents": "~2.1.2",
284 | "glob-parent": "~5.1.0",
285 | "is-binary-path": "~2.1.0",
286 | "is-glob": "~4.0.1",
287 | "normalize-path": "~3.0.0",
288 | "readdirp": "~3.4.0"
289 | }
290 | },
291 | "ci-info": {
292 | "version": "2.0.0",
293 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
294 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
295 | "dev": true
296 | },
297 | "cli-boxes": {
298 | "version": "2.2.0",
299 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
300 | "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==",
301 | "dev": true
302 | },
303 | "clone-response": {
304 | "version": "1.0.2",
305 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
306 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
307 | "dev": true,
308 | "requires": {
309 | "mimic-response": "^1.0.0"
310 | }
311 | },
312 | "color-convert": {
313 | "version": "2.0.1",
314 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
315 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
316 | "dev": true,
317 | "requires": {
318 | "color-name": "~1.1.4"
319 | }
320 | },
321 | "color-name": {
322 | "version": "1.1.4",
323 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
324 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
325 | "dev": true
326 | },
327 | "component-bind": {
328 | "version": "1.0.0",
329 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
330 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
331 | },
332 | "component-emitter": {
333 | "version": "1.3.0",
334 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
335 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
336 | },
337 | "component-inherit": {
338 | "version": "0.0.3",
339 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
340 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
341 | },
342 | "concat-map": {
343 | "version": "0.0.1",
344 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
345 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
346 | "dev": true
347 | },
348 | "configstore": {
349 | "version": "5.0.1",
350 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
351 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
352 | "dev": true,
353 | "requires": {
354 | "dot-prop": "^5.2.0",
355 | "graceful-fs": "^4.1.2",
356 | "make-dir": "^3.0.0",
357 | "unique-string": "^2.0.0",
358 | "write-file-atomic": "^3.0.0",
359 | "xdg-basedir": "^4.0.0"
360 | }
361 | },
362 | "content-disposition": {
363 | "version": "0.5.4",
364 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
365 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
366 | "requires": {
367 | "safe-buffer": "5.2.1"
368 | }
369 | },
370 | "content-type": {
371 | "version": "1.0.4",
372 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
373 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
374 | },
375 | "cookie": {
376 | "version": "0.4.1",
377 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
378 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
379 | },
380 | "cookie-signature": {
381 | "version": "1.0.6",
382 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
383 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
384 | },
385 | "cors": {
386 | "version": "2.8.5",
387 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
388 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
389 | "requires": {
390 | "object-assign": "^4",
391 | "vary": "^1"
392 | }
393 | },
394 | "crypto-random-string": {
395 | "version": "2.0.0",
396 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
397 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
398 | "dev": true
399 | },
400 | "debug": {
401 | "version": "3.2.6",
402 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
403 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
404 | "dev": true,
405 | "requires": {
406 | "ms": "^2.1.1"
407 | }
408 | },
409 | "decompress-response": {
410 | "version": "3.3.0",
411 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
412 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
413 | "dev": true,
414 | "requires": {
415 | "mimic-response": "^1.0.0"
416 | }
417 | },
418 | "deep-extend": {
419 | "version": "0.6.0",
420 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
421 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
422 | "dev": true
423 | },
424 | "defer-to-connect": {
425 | "version": "1.1.3",
426 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
427 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
428 | "dev": true
429 | },
430 | "depd": {
431 | "version": "1.1.2",
432 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
433 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="
434 | },
435 | "destroy": {
436 | "version": "1.0.4",
437 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
438 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg=="
439 | },
440 | "dot-prop": {
441 | "version": "5.2.0",
442 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
443 | "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
444 | "dev": true,
445 | "requires": {
446 | "is-obj": "^2.0.0"
447 | }
448 | },
449 | "duplexer3": {
450 | "version": "0.1.4",
451 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
452 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
453 | "dev": true
454 | },
455 | "ee-first": {
456 | "version": "1.1.1",
457 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
458 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
459 | },
460 | "emoji-regex": {
461 | "version": "7.0.3",
462 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
463 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
464 | "dev": true
465 | },
466 | "encodeurl": {
467 | "version": "1.0.2",
468 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
469 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
470 | },
471 | "end-of-stream": {
472 | "version": "1.4.4",
473 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
474 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
475 | "dev": true,
476 | "requires": {
477 | "once": "^1.4.0"
478 | }
479 | },
480 | "engine.io": {
481 | "version": "3.5.0",
482 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz",
483 | "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==",
484 | "requires": {
485 | "accepts": "~1.3.4",
486 | "base64id": "2.0.0",
487 | "cookie": "~0.4.1",
488 | "debug": "~4.1.0",
489 | "engine.io-parser": "~2.2.0",
490 | "ws": "~7.4.2"
491 | },
492 | "dependencies": {
493 | "debug": {
494 | "version": "4.1.1",
495 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
496 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
497 | "requires": {
498 | "ms": "^2.1.1"
499 | }
500 | }
501 | }
502 | },
503 | "engine.io-client": {
504 | "version": "3.5.0",
505 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz",
506 | "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==",
507 | "requires": {
508 | "component-emitter": "~1.3.0",
509 | "component-inherit": "0.0.3",
510 | "debug": "~3.1.0",
511 | "engine.io-parser": "~2.2.0",
512 | "has-cors": "1.1.0",
513 | "indexof": "0.0.1",
514 | "parseqs": "0.0.6",
515 | "parseuri": "0.0.6",
516 | "ws": "~7.4.2",
517 | "xmlhttprequest-ssl": "~1.5.4",
518 | "yeast": "0.1.2"
519 | },
520 | "dependencies": {
521 | "debug": {
522 | "version": "3.1.0",
523 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
524 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
525 | "requires": {
526 | "ms": "2.0.0"
527 | }
528 | },
529 | "ms": {
530 | "version": "2.0.0",
531 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
532 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
533 | }
534 | }
535 | },
536 | "engine.io-parser": {
537 | "version": "2.2.1",
538 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
539 | "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
540 | "requires": {
541 | "after": "0.8.2",
542 | "arraybuffer.slice": "~0.0.7",
543 | "base64-arraybuffer": "0.1.4",
544 | "blob": "0.0.5",
545 | "has-binary2": "~1.0.2"
546 | }
547 | },
548 | "escape-goat": {
549 | "version": "2.1.1",
550 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
551 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
552 | "dev": true
553 | },
554 | "escape-html": {
555 | "version": "1.0.3",
556 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
557 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
558 | },
559 | "etag": {
560 | "version": "1.8.1",
561 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
562 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
563 | },
564 | "express": {
565 | "version": "4.17.3",
566 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
567 | "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
568 | "requires": {
569 | "accepts": "~1.3.8",
570 | "array-flatten": "1.1.1",
571 | "body-parser": "1.19.2",
572 | "content-disposition": "0.5.4",
573 | "content-type": "~1.0.4",
574 | "cookie": "0.4.2",
575 | "cookie-signature": "1.0.6",
576 | "debug": "2.6.9",
577 | "depd": "~1.1.2",
578 | "encodeurl": "~1.0.2",
579 | "escape-html": "~1.0.3",
580 | "etag": "~1.8.1",
581 | "finalhandler": "~1.1.2",
582 | "fresh": "0.5.2",
583 | "merge-descriptors": "1.0.1",
584 | "methods": "~1.1.2",
585 | "on-finished": "~2.3.0",
586 | "parseurl": "~1.3.3",
587 | "path-to-regexp": "0.1.7",
588 | "proxy-addr": "~2.0.7",
589 | "qs": "6.9.7",
590 | "range-parser": "~1.2.1",
591 | "safe-buffer": "5.2.1",
592 | "send": "0.17.2",
593 | "serve-static": "1.14.2",
594 | "setprototypeof": "1.2.0",
595 | "statuses": "~1.5.0",
596 | "type-is": "~1.6.18",
597 | "utils-merge": "1.0.1",
598 | "vary": "~1.1.2"
599 | },
600 | "dependencies": {
601 | "accepts": {
602 | "version": "1.3.8",
603 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
604 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
605 | "requires": {
606 | "mime-types": "~2.1.34",
607 | "negotiator": "0.6.3"
608 | }
609 | },
610 | "cookie": {
611 | "version": "0.4.2",
612 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
613 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
614 | },
615 | "debug": {
616 | "version": "2.6.9",
617 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
618 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
619 | "requires": {
620 | "ms": "2.0.0"
621 | }
622 | },
623 | "mime-db": {
624 | "version": "1.52.0",
625 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
626 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
627 | },
628 | "mime-types": {
629 | "version": "2.1.35",
630 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
631 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
632 | "requires": {
633 | "mime-db": "1.52.0"
634 | }
635 | },
636 | "ms": {
637 | "version": "2.0.0",
638 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
639 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
640 | },
641 | "negotiator": {
642 | "version": "0.6.3",
643 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
644 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
645 | }
646 | }
647 | },
648 | "fill-range": {
649 | "version": "7.0.1",
650 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
651 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
652 | "dev": true,
653 | "requires": {
654 | "to-regex-range": "^5.0.1"
655 | }
656 | },
657 | "finalhandler": {
658 | "version": "1.1.2",
659 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
660 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
661 | "requires": {
662 | "debug": "2.6.9",
663 | "encodeurl": "~1.0.2",
664 | "escape-html": "~1.0.3",
665 | "on-finished": "~2.3.0",
666 | "parseurl": "~1.3.3",
667 | "statuses": "~1.5.0",
668 | "unpipe": "~1.0.0"
669 | },
670 | "dependencies": {
671 | "debug": {
672 | "version": "2.6.9",
673 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
674 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
675 | "requires": {
676 | "ms": "2.0.0"
677 | }
678 | },
679 | "ms": {
680 | "version": "2.0.0",
681 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
682 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
683 | }
684 | }
685 | },
686 | "forwarded": {
687 | "version": "0.2.0",
688 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
689 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
690 | },
691 | "fresh": {
692 | "version": "0.5.2",
693 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
694 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
695 | },
696 | "fsevents": {
697 | "version": "2.1.3",
698 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
699 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
700 | "dev": true,
701 | "optional": true
702 | },
703 | "get-stream": {
704 | "version": "4.1.0",
705 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
706 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
707 | "dev": true,
708 | "requires": {
709 | "pump": "^3.0.0"
710 | }
711 | },
712 | "glob-parent": {
713 | "version": "5.1.2",
714 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
715 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
716 | "dev": true,
717 | "requires": {
718 | "is-glob": "^4.0.1"
719 | }
720 | },
721 | "global-dirs": {
722 | "version": "2.0.1",
723 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
724 | "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
725 | "dev": true,
726 | "requires": {
727 | "ini": "^1.3.5"
728 | }
729 | },
730 | "got": {
731 | "version": "9.6.0",
732 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
733 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
734 | "dev": true,
735 | "requires": {
736 | "@sindresorhus/is": "^0.14.0",
737 | "@szmarczak/http-timer": "^1.1.2",
738 | "cacheable-request": "^6.0.0",
739 | "decompress-response": "^3.3.0",
740 | "duplexer3": "^0.1.4",
741 | "get-stream": "^4.1.0",
742 | "lowercase-keys": "^1.0.1",
743 | "mimic-response": "^1.0.1",
744 | "p-cancelable": "^1.0.0",
745 | "to-readable-stream": "^1.0.0",
746 | "url-parse-lax": "^3.0.0"
747 | }
748 | },
749 | "graceful-fs": {
750 | "version": "4.2.4",
751 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
752 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
753 | "dev": true
754 | },
755 | "has-binary2": {
756 | "version": "1.0.3",
757 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
758 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
759 | "requires": {
760 | "isarray": "2.0.1"
761 | }
762 | },
763 | "has-cors": {
764 | "version": "1.1.0",
765 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
766 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
767 | },
768 | "has-flag": {
769 | "version": "3.0.0",
770 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
771 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
772 | "dev": true
773 | },
774 | "has-yarn": {
775 | "version": "2.1.0",
776 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
777 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
778 | "dev": true
779 | },
780 | "http-cache-semantics": {
781 | "version": "4.1.0",
782 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
783 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
784 | "dev": true
785 | },
786 | "http-errors": {
787 | "version": "1.8.1",
788 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
789 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
790 | "requires": {
791 | "depd": "~1.1.2",
792 | "inherits": "2.0.4",
793 | "setprototypeof": "1.2.0",
794 | "statuses": ">= 1.5.0 < 2",
795 | "toidentifier": "1.0.1"
796 | }
797 | },
798 | "iconv-lite": {
799 | "version": "0.4.24",
800 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
801 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
802 | "requires": {
803 | "safer-buffer": ">= 2.1.2 < 3"
804 | }
805 | },
806 | "ignore-by-default": {
807 | "version": "1.0.1",
808 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
809 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
810 | "dev": true
811 | },
812 | "import-lazy": {
813 | "version": "2.1.0",
814 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
815 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
816 | "dev": true
817 | },
818 | "imurmurhash": {
819 | "version": "0.1.4",
820 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
821 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
822 | "dev": true
823 | },
824 | "indexof": {
825 | "version": "0.0.1",
826 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
827 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
828 | },
829 | "inherits": {
830 | "version": "2.0.4",
831 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
832 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
833 | },
834 | "ini": {
835 | "version": "1.3.8",
836 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
837 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
838 | "dev": true
839 | },
840 | "ipaddr.js": {
841 | "version": "1.9.1",
842 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
843 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
844 | },
845 | "is-binary-path": {
846 | "version": "2.1.0",
847 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
848 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
849 | "dev": true,
850 | "requires": {
851 | "binary-extensions": "^2.0.0"
852 | }
853 | },
854 | "is-ci": {
855 | "version": "2.0.0",
856 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
857 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
858 | "dev": true,
859 | "requires": {
860 | "ci-info": "^2.0.0"
861 | }
862 | },
863 | "is-extglob": {
864 | "version": "2.1.1",
865 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
866 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
867 | "dev": true
868 | },
869 | "is-fullwidth-code-point": {
870 | "version": "2.0.0",
871 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
872 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
873 | "dev": true
874 | },
875 | "is-glob": {
876 | "version": "4.0.1",
877 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
878 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
879 | "dev": true,
880 | "requires": {
881 | "is-extglob": "^2.1.1"
882 | }
883 | },
884 | "is-installed-globally": {
885 | "version": "0.3.2",
886 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
887 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
888 | "dev": true,
889 | "requires": {
890 | "global-dirs": "^2.0.1",
891 | "is-path-inside": "^3.0.1"
892 | }
893 | },
894 | "is-npm": {
895 | "version": "4.0.0",
896 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
897 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
898 | "dev": true
899 | },
900 | "is-number": {
901 | "version": "7.0.0",
902 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
903 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
904 | "dev": true
905 | },
906 | "is-obj": {
907 | "version": "2.0.0",
908 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
909 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
910 | "dev": true
911 | },
912 | "is-path-inside": {
913 | "version": "3.0.2",
914 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
915 | "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
916 | "dev": true
917 | },
918 | "is-typedarray": {
919 | "version": "1.0.0",
920 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
921 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
922 | "dev": true
923 | },
924 | "is-yarn-global": {
925 | "version": "0.3.0",
926 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
927 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
928 | "dev": true
929 | },
930 | "isarray": {
931 | "version": "2.0.1",
932 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
933 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
934 | },
935 | "json-buffer": {
936 | "version": "3.0.0",
937 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
938 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
939 | "dev": true
940 | },
941 | "keyv": {
942 | "version": "3.1.0",
943 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
944 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
945 | "dev": true,
946 | "requires": {
947 | "json-buffer": "3.0.0"
948 | }
949 | },
950 | "latest-version": {
951 | "version": "5.1.0",
952 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
953 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
954 | "dev": true,
955 | "requires": {
956 | "package-json": "^6.3.0"
957 | }
958 | },
959 | "lowercase-keys": {
960 | "version": "1.0.1",
961 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
962 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
963 | "dev": true
964 | },
965 | "make-dir": {
966 | "version": "3.1.0",
967 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
968 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
969 | "dev": true,
970 | "requires": {
971 | "semver": "^6.0.0"
972 | },
973 | "dependencies": {
974 | "semver": {
975 | "version": "6.3.0",
976 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
977 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
978 | "dev": true
979 | }
980 | }
981 | },
982 | "media-typer": {
983 | "version": "0.3.0",
984 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
985 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
986 | },
987 | "merge-descriptors": {
988 | "version": "1.0.1",
989 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
990 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
991 | },
992 | "methods": {
993 | "version": "1.1.2",
994 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
995 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
996 | },
997 | "mime": {
998 | "version": "1.6.0",
999 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1000 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1001 | },
1002 | "mime-db": {
1003 | "version": "1.44.0",
1004 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
1005 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
1006 | },
1007 | "mime-types": {
1008 | "version": "2.1.27",
1009 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
1010 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
1011 | "requires": {
1012 | "mime-db": "1.44.0"
1013 | }
1014 | },
1015 | "mimic-response": {
1016 | "version": "1.0.1",
1017 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
1018 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
1019 | "dev": true
1020 | },
1021 | "minimatch": {
1022 | "version": "3.0.4",
1023 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1024 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1025 | "dev": true,
1026 | "requires": {
1027 | "brace-expansion": "^1.1.7"
1028 | }
1029 | },
1030 | "minimist": {
1031 | "version": "1.2.6",
1032 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
1033 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
1034 | "dev": true
1035 | },
1036 | "ms": {
1037 | "version": "2.1.2",
1038 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1039 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1040 | },
1041 | "negotiator": {
1042 | "version": "0.6.2",
1043 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1044 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1045 | },
1046 | "nodemon": {
1047 | "version": "2.0.4",
1048 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
1049 | "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
1050 | "dev": true,
1051 | "requires": {
1052 | "chokidar": "^3.2.2",
1053 | "debug": "^3.2.6",
1054 | "ignore-by-default": "^1.0.1",
1055 | "minimatch": "^3.0.4",
1056 | "pstree.remy": "^1.1.7",
1057 | "semver": "^5.7.1",
1058 | "supports-color": "^5.5.0",
1059 | "touch": "^3.1.0",
1060 | "undefsafe": "^2.0.2",
1061 | "update-notifier": "^4.0.0"
1062 | }
1063 | },
1064 | "nopt": {
1065 | "version": "1.0.10",
1066 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1067 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1068 | "dev": true,
1069 | "requires": {
1070 | "abbrev": "1"
1071 | }
1072 | },
1073 | "normalize-path": {
1074 | "version": "3.0.0",
1075 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1076 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1077 | "dev": true
1078 | },
1079 | "normalize-url": {
1080 | "version": "4.5.1",
1081 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
1082 | "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
1083 | "dev": true
1084 | },
1085 | "object-assign": {
1086 | "version": "4.1.1",
1087 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1088 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1089 | },
1090 | "on-finished": {
1091 | "version": "2.3.0",
1092 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1093 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
1094 | "requires": {
1095 | "ee-first": "1.1.1"
1096 | }
1097 | },
1098 | "once": {
1099 | "version": "1.4.0",
1100 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1101 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1102 | "dev": true,
1103 | "requires": {
1104 | "wrappy": "1"
1105 | }
1106 | },
1107 | "p-cancelable": {
1108 | "version": "1.1.0",
1109 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
1110 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
1111 | "dev": true
1112 | },
1113 | "package-json": {
1114 | "version": "6.5.0",
1115 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
1116 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
1117 | "dev": true,
1118 | "requires": {
1119 | "got": "^9.6.0",
1120 | "registry-auth-token": "^4.0.0",
1121 | "registry-url": "^5.0.0",
1122 | "semver": "^6.2.0"
1123 | },
1124 | "dependencies": {
1125 | "semver": {
1126 | "version": "6.3.0",
1127 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1128 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1129 | "dev": true
1130 | }
1131 | }
1132 | },
1133 | "parseqs": {
1134 | "version": "0.0.6",
1135 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
1136 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
1137 | },
1138 | "parseuri": {
1139 | "version": "0.0.6",
1140 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
1141 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
1142 | },
1143 | "parseurl": {
1144 | "version": "1.3.3",
1145 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1146 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1147 | },
1148 | "path-to-regexp": {
1149 | "version": "0.1.7",
1150 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1151 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1152 | },
1153 | "picomatch": {
1154 | "version": "2.2.2",
1155 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
1156 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
1157 | "dev": true
1158 | },
1159 | "prepend-http": {
1160 | "version": "2.0.0",
1161 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
1162 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
1163 | "dev": true
1164 | },
1165 | "proxy-addr": {
1166 | "version": "2.0.7",
1167 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1168 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1169 | "requires": {
1170 | "forwarded": "0.2.0",
1171 | "ipaddr.js": "1.9.1"
1172 | }
1173 | },
1174 | "pstree.remy": {
1175 | "version": "1.1.8",
1176 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1177 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1178 | "dev": true
1179 | },
1180 | "pump": {
1181 | "version": "3.0.0",
1182 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1183 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1184 | "dev": true,
1185 | "requires": {
1186 | "end-of-stream": "^1.1.0",
1187 | "once": "^1.3.1"
1188 | }
1189 | },
1190 | "pupa": {
1191 | "version": "2.0.1",
1192 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
1193 | "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
1194 | "dev": true,
1195 | "requires": {
1196 | "escape-goat": "^2.0.0"
1197 | }
1198 | },
1199 | "qs": {
1200 | "version": "6.9.7",
1201 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
1202 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw=="
1203 | },
1204 | "range-parser": {
1205 | "version": "1.2.1",
1206 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1207 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1208 | },
1209 | "raw-body": {
1210 | "version": "2.4.3",
1211 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
1212 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
1213 | "requires": {
1214 | "bytes": "3.1.2",
1215 | "http-errors": "1.8.1",
1216 | "iconv-lite": "0.4.24",
1217 | "unpipe": "1.0.0"
1218 | }
1219 | },
1220 | "rc": {
1221 | "version": "1.2.8",
1222 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1223 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1224 | "dev": true,
1225 | "requires": {
1226 | "deep-extend": "^0.6.0",
1227 | "ini": "~1.3.0",
1228 | "minimist": "^1.2.0",
1229 | "strip-json-comments": "~2.0.1"
1230 | }
1231 | },
1232 | "readdirp": {
1233 | "version": "3.4.0",
1234 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
1235 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
1236 | "dev": true,
1237 | "requires": {
1238 | "picomatch": "^2.2.1"
1239 | }
1240 | },
1241 | "registry-auth-token": {
1242 | "version": "4.1.1",
1243 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz",
1244 | "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==",
1245 | "dev": true,
1246 | "requires": {
1247 | "rc": "^1.2.8"
1248 | }
1249 | },
1250 | "registry-url": {
1251 | "version": "5.1.0",
1252 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
1253 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
1254 | "dev": true,
1255 | "requires": {
1256 | "rc": "^1.2.8"
1257 | }
1258 | },
1259 | "responselike": {
1260 | "version": "1.0.2",
1261 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
1262 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
1263 | "dev": true,
1264 | "requires": {
1265 | "lowercase-keys": "^1.0.0"
1266 | }
1267 | },
1268 | "safe-buffer": {
1269 | "version": "5.2.1",
1270 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1271 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1272 | },
1273 | "safer-buffer": {
1274 | "version": "2.1.2",
1275 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1276 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1277 | },
1278 | "semver": {
1279 | "version": "5.7.1",
1280 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1281 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1282 | "dev": true
1283 | },
1284 | "semver-diff": {
1285 | "version": "3.1.1",
1286 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
1287 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
1288 | "dev": true,
1289 | "requires": {
1290 | "semver": "^6.3.0"
1291 | },
1292 | "dependencies": {
1293 | "semver": {
1294 | "version": "6.3.0",
1295 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1296 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1297 | "dev": true
1298 | }
1299 | }
1300 | },
1301 | "send": {
1302 | "version": "0.17.2",
1303 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
1304 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
1305 | "requires": {
1306 | "debug": "2.6.9",
1307 | "depd": "~1.1.2",
1308 | "destroy": "~1.0.4",
1309 | "encodeurl": "~1.0.2",
1310 | "escape-html": "~1.0.3",
1311 | "etag": "~1.8.1",
1312 | "fresh": "0.5.2",
1313 | "http-errors": "1.8.1",
1314 | "mime": "1.6.0",
1315 | "ms": "2.1.3",
1316 | "on-finished": "~2.3.0",
1317 | "range-parser": "~1.2.1",
1318 | "statuses": "~1.5.0"
1319 | },
1320 | "dependencies": {
1321 | "debug": {
1322 | "version": "2.6.9",
1323 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1324 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1325 | "requires": {
1326 | "ms": "2.0.0"
1327 | },
1328 | "dependencies": {
1329 | "ms": {
1330 | "version": "2.0.0",
1331 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1332 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1333 | }
1334 | }
1335 | },
1336 | "ms": {
1337 | "version": "2.1.3",
1338 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1339 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1340 | }
1341 | }
1342 | },
1343 | "serve-static": {
1344 | "version": "1.14.2",
1345 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
1346 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
1347 | "requires": {
1348 | "encodeurl": "~1.0.2",
1349 | "escape-html": "~1.0.3",
1350 | "parseurl": "~1.3.3",
1351 | "send": "0.17.2"
1352 | }
1353 | },
1354 | "setprototypeof": {
1355 | "version": "1.2.0",
1356 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1357 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1358 | },
1359 | "signal-exit": {
1360 | "version": "3.0.3",
1361 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1362 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1363 | "dev": true
1364 | },
1365 | "socket.io": {
1366 | "version": "2.4.0",
1367 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz",
1368 | "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==",
1369 | "requires": {
1370 | "debug": "~4.1.0",
1371 | "engine.io": "~3.5.0",
1372 | "has-binary2": "~1.0.2",
1373 | "socket.io-adapter": "~1.1.0",
1374 | "socket.io-client": "2.4.0",
1375 | "socket.io-parser": "~3.4.0"
1376 | },
1377 | "dependencies": {
1378 | "debug": {
1379 | "version": "4.1.1",
1380 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
1381 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
1382 | "requires": {
1383 | "ms": "^2.1.1"
1384 | }
1385 | }
1386 | }
1387 | },
1388 | "socket.io-adapter": {
1389 | "version": "1.1.2",
1390 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
1391 | "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
1392 | },
1393 | "socket.io-client": {
1394 | "version": "2.4.0",
1395 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz",
1396 | "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==",
1397 | "requires": {
1398 | "backo2": "1.0.2",
1399 | "component-bind": "1.0.0",
1400 | "component-emitter": "~1.3.0",
1401 | "debug": "~3.1.0",
1402 | "engine.io-client": "~3.5.0",
1403 | "has-binary2": "~1.0.2",
1404 | "indexof": "0.0.1",
1405 | "parseqs": "0.0.6",
1406 | "parseuri": "0.0.6",
1407 | "socket.io-parser": "~3.3.0",
1408 | "to-array": "0.1.4"
1409 | },
1410 | "dependencies": {
1411 | "debug": {
1412 | "version": "3.1.0",
1413 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1414 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1415 | "requires": {
1416 | "ms": "2.0.0"
1417 | }
1418 | },
1419 | "ms": {
1420 | "version": "2.0.0",
1421 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1422 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1423 | },
1424 | "socket.io-parser": {
1425 | "version": "3.3.2",
1426 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz",
1427 | "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==",
1428 | "requires": {
1429 | "component-emitter": "~1.3.0",
1430 | "debug": "~3.1.0",
1431 | "isarray": "2.0.1"
1432 | }
1433 | }
1434 | }
1435 | },
1436 | "socket.io-parser": {
1437 | "version": "3.4.1",
1438 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz",
1439 | "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==",
1440 | "requires": {
1441 | "component-emitter": "1.2.1",
1442 | "debug": "~4.1.0",
1443 | "isarray": "2.0.1"
1444 | },
1445 | "dependencies": {
1446 | "component-emitter": {
1447 | "version": "1.2.1",
1448 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
1449 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
1450 | },
1451 | "debug": {
1452 | "version": "4.1.1",
1453 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
1454 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
1455 | "requires": {
1456 | "ms": "^2.1.1"
1457 | }
1458 | }
1459 | }
1460 | },
1461 | "statuses": {
1462 | "version": "1.5.0",
1463 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1464 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="
1465 | },
1466 | "string-width": {
1467 | "version": "4.2.0",
1468 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
1469 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
1470 | "dev": true,
1471 | "requires": {
1472 | "emoji-regex": "^8.0.0",
1473 | "is-fullwidth-code-point": "^3.0.0",
1474 | "strip-ansi": "^6.0.0"
1475 | },
1476 | "dependencies": {
1477 | "ansi-regex": {
1478 | "version": "5.0.1",
1479 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1480 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1481 | "dev": true
1482 | },
1483 | "emoji-regex": {
1484 | "version": "8.0.0",
1485 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1486 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1487 | "dev": true
1488 | },
1489 | "is-fullwidth-code-point": {
1490 | "version": "3.0.0",
1491 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1492 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1493 | "dev": true
1494 | },
1495 | "strip-ansi": {
1496 | "version": "6.0.0",
1497 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
1498 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
1499 | "dev": true,
1500 | "requires": {
1501 | "ansi-regex": "^5.0.0"
1502 | }
1503 | }
1504 | }
1505 | },
1506 | "strip-ansi": {
1507 | "version": "5.2.0",
1508 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1509 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1510 | "dev": true,
1511 | "requires": {
1512 | "ansi-regex": "^4.1.0"
1513 | }
1514 | },
1515 | "strip-json-comments": {
1516 | "version": "2.0.1",
1517 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1518 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1519 | "dev": true
1520 | },
1521 | "supports-color": {
1522 | "version": "5.5.0",
1523 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1524 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1525 | "dev": true,
1526 | "requires": {
1527 | "has-flag": "^3.0.0"
1528 | }
1529 | },
1530 | "term-size": {
1531 | "version": "2.2.0",
1532 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
1533 | "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
1534 | "dev": true
1535 | },
1536 | "to-array": {
1537 | "version": "0.1.4",
1538 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
1539 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
1540 | },
1541 | "to-readable-stream": {
1542 | "version": "1.0.0",
1543 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
1544 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
1545 | "dev": true
1546 | },
1547 | "to-regex-range": {
1548 | "version": "5.0.1",
1549 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1550 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1551 | "dev": true,
1552 | "requires": {
1553 | "is-number": "^7.0.0"
1554 | }
1555 | },
1556 | "toidentifier": {
1557 | "version": "1.0.1",
1558 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1559 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1560 | },
1561 | "touch": {
1562 | "version": "3.1.0",
1563 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1564 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1565 | "dev": true,
1566 | "requires": {
1567 | "nopt": "~1.0.10"
1568 | }
1569 | },
1570 | "type-fest": {
1571 | "version": "0.8.1",
1572 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
1573 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
1574 | "dev": true
1575 | },
1576 | "type-is": {
1577 | "version": "1.6.18",
1578 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1579 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1580 | "requires": {
1581 | "media-typer": "0.3.0",
1582 | "mime-types": "~2.1.24"
1583 | }
1584 | },
1585 | "typedarray-to-buffer": {
1586 | "version": "3.1.5",
1587 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
1588 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
1589 | "dev": true,
1590 | "requires": {
1591 | "is-typedarray": "^1.0.0"
1592 | }
1593 | },
1594 | "undefsafe": {
1595 | "version": "2.0.3",
1596 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
1597 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
1598 | "dev": true,
1599 | "requires": {
1600 | "debug": "^2.2.0"
1601 | },
1602 | "dependencies": {
1603 | "debug": {
1604 | "version": "2.6.9",
1605 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1606 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1607 | "dev": true,
1608 | "requires": {
1609 | "ms": "2.0.0"
1610 | }
1611 | },
1612 | "ms": {
1613 | "version": "2.0.0",
1614 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1615 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1616 | "dev": true
1617 | }
1618 | }
1619 | },
1620 | "unique-string": {
1621 | "version": "2.0.0",
1622 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
1623 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
1624 | "dev": true,
1625 | "requires": {
1626 | "crypto-random-string": "^2.0.0"
1627 | }
1628 | },
1629 | "unpipe": {
1630 | "version": "1.0.0",
1631 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1632 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1633 | },
1634 | "update-notifier": {
1635 | "version": "4.1.0",
1636 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz",
1637 | "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==",
1638 | "dev": true,
1639 | "requires": {
1640 | "boxen": "^4.2.0",
1641 | "chalk": "^3.0.0",
1642 | "configstore": "^5.0.1",
1643 | "has-yarn": "^2.1.0",
1644 | "import-lazy": "^2.1.0",
1645 | "is-ci": "^2.0.0",
1646 | "is-installed-globally": "^0.3.1",
1647 | "is-npm": "^4.0.0",
1648 | "is-yarn-global": "^0.3.0",
1649 | "latest-version": "^5.0.0",
1650 | "pupa": "^2.0.1",
1651 | "semver-diff": "^3.1.1",
1652 | "xdg-basedir": "^4.0.0"
1653 | }
1654 | },
1655 | "url-parse-lax": {
1656 | "version": "3.0.0",
1657 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
1658 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
1659 | "dev": true,
1660 | "requires": {
1661 | "prepend-http": "^2.0.0"
1662 | }
1663 | },
1664 | "utils-merge": {
1665 | "version": "1.0.1",
1666 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1667 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1668 | },
1669 | "vary": {
1670 | "version": "1.1.2",
1671 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1672 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1673 | },
1674 | "widest-line": {
1675 | "version": "3.1.0",
1676 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
1677 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
1678 | "dev": true,
1679 | "requires": {
1680 | "string-width": "^4.0.0"
1681 | }
1682 | },
1683 | "wrappy": {
1684 | "version": "1.0.2",
1685 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1686 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1687 | "dev": true
1688 | },
1689 | "write-file-atomic": {
1690 | "version": "3.0.3",
1691 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
1692 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
1693 | "dev": true,
1694 | "requires": {
1695 | "imurmurhash": "^0.1.4",
1696 | "is-typedarray": "^1.0.0",
1697 | "signal-exit": "^3.0.2",
1698 | "typedarray-to-buffer": "^3.1.5"
1699 | }
1700 | },
1701 | "ws": {
1702 | "version": "7.4.6",
1703 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
1704 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
1705 | },
1706 | "xdg-basedir": {
1707 | "version": "4.0.0",
1708 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
1709 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
1710 | "dev": true
1711 | },
1712 | "xmlhttprequest-ssl": {
1713 | "version": "1.5.5",
1714 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
1715 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
1716 | },
1717 | "yeast": {
1718 | "version": "0.1.2",
1719 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
1720 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
1721 | }
1722 | }
1723 | }
1724 |
--------------------------------------------------------------------------------