From 9928a206774db7ea8591721b3ccdc9f7627ad61d Mon Sep 17 00:00:00 2001 From: Santiago Lo Coco <slococo@itba.edu.ar> Date: Mon, 19 Dec 2022 20:24:44 -0300 Subject: [PATCH] Update frontend and fix more bugs Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar> Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar> --- .gitignore | 2 + bsition/api/endpoints/documents.py | 16 +- bsition/api/models/document.py | 4 +- bsition/backend/elastic/search.py | 8 +- bsition/backend/mongo/documents.py | 1 + bsition/backend/postgres/relations.py | 13 + bsition/frontend/nextjs | 1 - bsition/frontend/nextjs/.gitignore | 31 + bsition/frontend/nextjs/next-env.d.ts | 5 + bsition/frontend/nextjs/package-lock.json | 3021 +++++++++++++++++ bsition/frontend/nextjs/package.json | 27 + bsition/frontend/nextjs/postcss.config.js | 6 + bsition/frontend/nextjs/public/favicon.ico | Bin 0 -> 25279 bytes .../nextjs/src/components/Document.tsx | 128 + .../frontend/nextjs/src/components/Layout.tsx | 16 + .../nextjs/src/components/Sidebar.tsx | 195 ++ .../src/components/icons/ArticleIcon.jsx | 22 + .../src/components/icons/CollapsIcon.jsx | 24 + .../src/components/icons/CreateIcon.jsx | 21 + .../src/components/icons/DeleteIcon.jsx | 21 + .../nextjs/src/components/icons/HomeIcon.jsx | 21 + .../nextjs/src/components/icons/LockIcon.jsx | 21 + .../nextjs/src/components/icons/Logo.jsx | 41 + .../src/components/icons/LogoutIcon.jsx | 21 + .../src/components/icons/ManageIcon.jsx | 21 + .../src/components/icons/OptionsIcon.jsx | 21 + .../src/components/icons/PublicIcon.jsx | 21 + .../src/components/icons/SearchIcon.jsx | 21 + .../nextjs/src/components/icons/ShareIcon.jsx | 21 + .../nextjs/src/components/icons/UsersIcon.jsx | 24 + .../src/components/icons/VideosIcon.jsx | 22 + .../nextjs/src/components/icons/index.js | 16 + bsition/frontend/nextjs/src/pages/_app.tsx | 17 + .../frontend/nextjs/src/pages/api/socket.tsx | 22 + .../nextjs/src/pages/create-document.tsx | 53 + .../nextjs/src/pages/documents/[id].tsx | 134 + .../src/pages/documents/[id]/access.tsx | 133 + bsition/frontend/nextjs/src/pages/index.tsx | 36 + bsition/frontend/nextjs/src/pages/login.tsx | 55 + bsition/frontend/nextjs/src/pages/search.tsx | 98 + .../nextjs/src/styles/Home.module.css | 116 + bsition/frontend/nextjs/src/styles/index.css | 103 + .../src/utils/sockets/messageHandler.tsx | 13 + bsition/frontend/nextjs/tailwind.config.js | 28 + bsition/frontend/nextjs/tsconfig.json | 30 + bsition/frontend/nextjs/yarn.lock | 964 ++++++ 46 files changed, 5627 insertions(+), 8 deletions(-) delete mode 160000 bsition/frontend/nextjs create mode 100644 bsition/frontend/nextjs/.gitignore create mode 100755 bsition/frontend/nextjs/next-env.d.ts create mode 100644 bsition/frontend/nextjs/package-lock.json create mode 100644 bsition/frontend/nextjs/package.json create mode 100644 bsition/frontend/nextjs/postcss.config.js create mode 100644 bsition/frontend/nextjs/public/favicon.ico create mode 100644 bsition/frontend/nextjs/src/components/Document.tsx create mode 100644 bsition/frontend/nextjs/src/components/Layout.tsx create mode 100644 bsition/frontend/nextjs/src/components/Sidebar.tsx create mode 100644 bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/LockIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/Logo.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx create mode 100644 bsition/frontend/nextjs/src/components/icons/index.js create mode 100644 bsition/frontend/nextjs/src/pages/_app.tsx create mode 100644 bsition/frontend/nextjs/src/pages/api/socket.tsx create mode 100644 bsition/frontend/nextjs/src/pages/create-document.tsx create mode 100644 bsition/frontend/nextjs/src/pages/documents/[id].tsx create mode 100644 bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx create mode 100644 bsition/frontend/nextjs/src/pages/index.tsx create mode 100644 bsition/frontend/nextjs/src/pages/login.tsx create mode 100644 bsition/frontend/nextjs/src/pages/search.tsx create mode 100644 bsition/frontend/nextjs/src/styles/Home.module.css create mode 100644 bsition/frontend/nextjs/src/styles/index.css create mode 100644 bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx create mode 100644 bsition/frontend/nextjs/tailwind.config.js create mode 100644 bsition/frontend/nextjs/tsconfig.json create mode 100644 bsition/frontend/nextjs/yarn.lock diff --git a/.gitignore b/.gitignore index 5d51d4e..6724f7f 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,5 @@ cython_debug/ *_data data/ test.py +.next +node_modules \ No newline at end of file diff --git a/bsition/api/endpoints/documents.py b/bsition/api/endpoints/documents.py index 3a9eb2c..9fba1f8 100644 --- a/bsition/api/endpoints/documents.py +++ b/bsition/api/endpoints/documents.py @@ -13,9 +13,14 @@ router = APIRouter() @router.post("") -def create(aux: Document): - mongo.create_document(json.loads(json.dumps(aux.__dict__))) - return JSONResponse(content={"detail": "Document created"}, status_code=201) +def create(aux: Document, user: tuple = Depends(get_current_user)): + doc_id = mongo.create_document({ + "name": aux.name, + "owner": user[0], + "data": aux.data if aux.data is not None else "" + }) + postgres.give_access_doc(user[0], doc_id, 1) + return JSONResponse(content={"detail": "Document created", "id": doc_id}, status_code=201) @router.get("") @@ -42,6 +47,11 @@ def edit_data(aux: DocumentUpdate, id: str): @router.get("/{id}/access") +def get_doc_access(id: str): + return postgres.access_to_doc(id) + + +@router.get("/{id}/access/me") def get_access(id: str, user: tuple = Depends(get_current_user)): return postgres.has_access_doc(user[0], id) diff --git a/bsition/api/models/document.py b/bsition/api/models/document.py index 70b4829..5c56d59 100644 --- a/bsition/api/models/document.py +++ b/bsition/api/models/document.py @@ -4,9 +4,7 @@ from pydantic.types import Optional class Document(BaseModel): name: str - access: list - data: str - owner: str + data: Optional[str] class DocumentUpdate(BaseModel): diff --git a/bsition/backend/elastic/search.py b/bsition/backend/elastic/search.py index b97b306..b3d5db9 100644 --- a/bsition/backend/elastic/search.py +++ b/bsition/backend/elastic/search.py @@ -26,7 +26,13 @@ def search(index, query, user_id): hits = [] for hit in resp["hits"]["hits"]: hits.append( - str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"] + # str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"] + # str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"] + { + "id": hit['_id'], + "name": hit['_source']["name"], + "highlight": str(hit["highlight"]["data"]) + } ) print(hit['_id'], hit['_source']) diff --git a/bsition/backend/mongo/documents.py b/bsition/backend/mongo/documents.py index 064fa86..158f3fa 100644 --- a/bsition/backend/mongo/documents.py +++ b/bsition/backend/mongo/documents.py @@ -33,6 +33,7 @@ def create_document(document): doc = document.copy() docs_coll.insert_one(document) elastic.add_document("test-index", document["_id"], doc) + return ObjectId(document["_id"]).__str__() def get_document_by_id(id): diff --git a/bsition/backend/postgres/relations.py b/bsition/backend/postgres/relations.py index 0e8d63a..c61c4e8 100644 --- a/bsition/backend/postgres/relations.py +++ b/bsition/backend/postgres/relations.py @@ -101,6 +101,19 @@ def has_access(user_id, id, destination): return list(cur.fetchall()) +def access_to_doc(id): + conn = get_connection() + cur = conn.cursor() + cur.execute( + sql.SQL( + "SELECT user_id, username, access_type FROM doc_access JOIN users ON user_id = users.id WHERE doc_id = {id}" + ).format( + id=sql.Literal(id), + ) + ) + return list(cur.fetchall()) + + def is_public(doc_id): conn = get_connection() cur = conn.cursor() diff --git a/bsition/frontend/nextjs b/bsition/frontend/nextjs deleted file mode 160000 index fbe106a..0000000 --- a/bsition/frontend/nextjs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fbe106a1878ccefb909a994cb16507bbf2a2d6ac diff --git a/bsition/frontend/nextjs/.gitignore b/bsition/frontend/nextjs/.gitignore new file mode 100644 index 0000000..560fedf --- /dev/null +++ b/bsition/frontend/nextjs/.gitignore @@ -0,0 +1,31 @@ +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + diff --git a/bsition/frontend/nextjs/next-env.d.ts b/bsition/frontend/nextjs/next-env.d.ts new file mode 100755 index 0000000..4f11a03 --- /dev/null +++ b/bsition/frontend/nextjs/next-env.d.ts @@ -0,0 +1,5 @@ +/// <reference types="next" /> +/// <reference types="next/image-types/global" /> + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/bsition/frontend/nextjs/package-lock.json b/bsition/frontend/nextjs/package-lock.json new file mode 100644 index 0000000..636957a --- /dev/null +++ b/bsition/frontend/nextjs/package-lock.json @@ -0,0 +1,3021 @@ +{ + "name": "nextjs-tailwindcss-typescript-starter", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "nextjs-tailwindcss-typescript-starter", + "version": "0.1.0", + "dependencies": { + "classnames": "^2.3.1", + "next": "12.1.0", + "react": "17.0.2", + "react-dom": "17.0.2", + "socket.io": "^4.5.1", + "socket.io-client": "^4.5.1" + }, + "devDependencies": { + "@types/node": "^17.0.21", + "@types/react": "^17.0.39", + "autoprefixer": "^10.4.2", + "postcss": "^8.4.7", + "postcss-import": "^14.0.2", + "tailwindcss": "^3.0.23", + "typescript": "^4.6.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@next/env": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", + "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" + }, + "node_modules/@next/swc-android-arm64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", + "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", + "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", + "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", + "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", + "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", + "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", + "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", + "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", + "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", + "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", + "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.39", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", + "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", + "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz", + "integrity": "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==", + "dev": true + }, + "node_modules/engine.io": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", + "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", + "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", + "dependencies": { + "@next/env": "12.1.0", + "caniuse-lite": "^1.0.30001283", + "postcss": "8.4.5", + "styled-jsx": "5.0.0", + "use-subscription": "1.5.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=12.22.0" + }, + "optionalDependencies": { + "@next/swc-android-arm64": "12.1.0", + "@next/swc-darwin-arm64": "12.1.0", + "@next/swc-darwin-x64": "12.1.0", + "@next/swc-linux-arm-gnueabihf": "12.1.0", + "@next/swc-linux-arm64-gnu": "12.1.0", + "@next/swc-linux-arm64-musl": "12.1.0", + "@next/swc-linux-x64-gnu": "12.1.0", + "@next/swc-linux-x64-musl": "12.1.0", + "@next/swc-win32-arm64-msvc": "12.1.0", + "@next/swc-win32-ia32-msvc": "12.1.0", + "@next/swc-win32-x64-msvc": "12.1.0" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^17.0.2 || ^18.0.0-0", + "react-dom": "^17.0.2 || ^18.0.0-0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "dev": true, + "dependencies": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, + "dependencies": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/socket.io": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + }, + "node_modules/socket.io-client": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz", + "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.2.3", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", + "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || 18.x.x" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", + "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", + "dev": true, + "dependencies": { + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss": "^8.4.6", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tailwindcss/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/use-subscription": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", + "dependencies": { + "object-assign": "^4.1.1" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@next/env": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", + "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" + }, + "@next/swc-android-arm64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", + "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", + "optional": true + }, + "@next/swc-darwin-arm64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", + "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", + "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", + "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", + "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", + "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", + "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", + "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", + "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", + "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", + "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/react": { + "version": "17.0.39", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz", + "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", + "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csstype": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz", + "integrity": "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==", + "dev": true + }, + "engine.io": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + } + }, + "engine.io-client": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "engine.io-parser": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fraction.js": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", + "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "next": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", + "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", + "requires": { + "@next/env": "12.1.0", + "@next/swc-android-arm64": "12.1.0", + "@next/swc-darwin-arm64": "12.1.0", + "@next/swc-darwin-x64": "12.1.0", + "@next/swc-linux-arm-gnueabihf": "12.1.0", + "@next/swc-linux-arm64-gnu": "12.1.0", + "@next/swc-linux-arm64-musl": "12.1.0", + "@next/swc-linux-x64-gnu": "12.1.0", + "@next/swc-linux-x64-musl": "12.1.0", + "@next/swc-win32-arm64-msvc": "12.1.0", + "@next/swc-win32-ia32-msvc": "12.1.0", + "@next/swc-win32-x64-msvc": "12.1.0", + "caniuse-lite": "^1.0.30001283", + "postcss": "8.4.5", + "styled-jsx": "5.0.0", + "use-subscription": "1.5.1" + }, + "dependencies": { + "postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + } + } + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "dev": true, + "requires": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, + "requires": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "socket.io": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" + } + }, + "socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + }, + "socket.io-client": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz", + "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.2.3", + "socket.io-parser": "~4.2.1" + } + }, + "socket.io-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "styled-jsx": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", + "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", + "requires": {} + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tailwindcss": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz", + "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==", + "dev": true, + "requires": { + "arg": "^5.0.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss": "^8.4.6", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "typescript": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "dev": true + }, + "use-subscription": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", + "requires": { + "object-assign": "^4.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/bsition/frontend/nextjs/package.json b/bsition/frontend/nextjs/package.json new file mode 100644 index 0000000..81ff3ab --- /dev/null +++ b/bsition/frontend/nextjs/package.json @@ -0,0 +1,27 @@ +{ + "name": "nextjs-tailwindcss-typescript-starter", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "classnames": "^2.3.1", + "next": "12.1.0", + "react": "17.0.2", + "react-dom": "17.0.2", + "socket.io": "^4.5.1", + "socket.io-client": "^4.5.1" + }, + "devDependencies": { + "@types/node": "^17.0.21", + "@types/react": "^17.0.39", + "autoprefixer": "^10.4.2", + "postcss": "^8.4.7", + "postcss-import": "^14.0.2", + "tailwindcss": "^3.0.23", + "typescript": "^4.6.2" + } +} diff --git a/bsition/frontend/nextjs/postcss.config.js b/bsition/frontend/nextjs/postcss.config.js new file mode 100644 index 0000000..dc301c1 --- /dev/null +++ b/bsition/frontend/nextjs/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: [ + 'tailwindcss', + 'autoprefixer', + ] +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/public/favicon.ico b/bsition/frontend/nextjs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..23c8e34425e8c019fb0f9ba61b4bd7133cd10951 GIT binary patch literal 25279 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 WbMxS28~jHK5_J`A<w`|V#D4*5F3bS{ literal 0 HcmV?d00001 diff --git a/bsition/frontend/nextjs/src/components/Document.tsx b/bsition/frontend/nextjs/src/components/Document.tsx new file mode 100644 index 0000000..a7c9e92 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/Document.tsx @@ -0,0 +1,128 @@ +import io from "socket.io-client"; +import { useState, useEffect } from "react"; + +let socket; + +export default function Document() { + const [username, setUsername] = useState(""); + const [chosenUsername, setChosenUsername] = useState(""); + const [text, setText] = useState(""); + const [token, setToken] = useState(""); + + useEffect(() => { + socketInitializer(); + }, [chosenUsername]); + + useEffect(() => { + const data = new URLSearchParams(); + data.append("username", "user") + data.append("password", "passtest") + + const fetchData = async (data) => { + const res = await fetch("http://localhost:8000/api/token", { method: 'POST', body: data}) + const json = await res.json(); + setToken(() => json["access_token"]) + } + + fetchData(data) + }, []) + + useEffect(() => { + if (token) { + const fetchData = async () => { + const res = await fetch("http://localhost:8000/api/documents/63866c991b4175934db26981", { + method: "GET", + headers: { + 'Authorization': `Bearer ${token}` + } + }) + const json = await res.json(); + setText(() => json["data"]) + } + + fetchData() + } + }, [token]) + + useEffect(() => { + const interval = setInterval(() => { + fetch("http://localhost:8000/api/documents/63866c991b4175934db26981", { + method: 'PUT', + body: `{"data": "${text}"}`, + headers: { + 'Content-type': 'application/json', + 'Authorization': `Bearer ${token}` + } + }) + }, 500); + + return () => clearInterval(interval); + }, [token, text]) + + const socketInitializer = async () => { + await fetch("/api/socket"); + + socket = io(); + + socket.emit('create', chosenUsername); + console.log(chosenUsername) + + socket.on("newIncomingText", (text) => { + setText(() => text); + console.log('text' + text); + }); + }; + + const sendText = async () => { + socket.emit("createdText", text, chosenUsername); + setText(() => text); + }; + + const handleKey = () => { + if (text) { + sendText(); + } + }; + + return ( + <div className="flex items-center p-4 mx-auto min-h-screen justify-center bg-purple-500"> + <main className="gap-4 flex flex-col items-center justify-center w-full h-full"> + {!chosenUsername ? ( + <> + <h3 className="font-bold text-white text-xl"> + doc_id? + </h3> + <input + type="text" + placeholder="Identity..." + value={username} + className="p-3 rounded-md outline-none" + onChange={(e) => setUsername(e.target.value)} + /> + <button + onClick={() => { + setChosenUsername(username); + }} + className="bg-white rounded-md px-4 py-2 text-xl" + > + Go! + </button> + </> + ) : ( + <> + <p className="font-bold text-white text-xl"> + Your username: {username} + </p> + + <textarea + placeholder="Type..." + onKeyUp={handleKey} + value={text} + onChange={(e) => setText(e.target.value)} + /> + </> + )} + </main> + </div> + ); +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/components/Layout.tsx b/bsition/frontend/nextjs/src/components/Layout.tsx new file mode 100644 index 0000000..3fc7a3b --- /dev/null +++ b/bsition/frontend/nextjs/src/components/Layout.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import Sidebar from "./Sidebar"; + +const Layout = ({ children }) => { + return ( + <div className="h-screen flex flex-row justify-start"> + <Sidebar /> + <div + className="bg-primary flex-1 p-4 text-white justify-center align-center h-full"> + {children} + </div> + </div> + ); +}; + +export default Layout; diff --git a/bsition/frontend/nextjs/src/components/Sidebar.tsx b/bsition/frontend/nextjs/src/components/Sidebar.tsx new file mode 100644 index 0000000..0710a13 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/Sidebar.tsx @@ -0,0 +1,195 @@ +import classNames from "classnames"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import React, {useState, useMemo, useEffect} from "react"; +import { + ArticleIcon, + CollapsIcon, + LogoIcon, + LogoutIcon, + SearchIcon, + HomeIcon, + CreateIcon +} from "./icons"; + +const Sidebar = () => { + const [toggleCollapse, setToggleCollapse] = useState(false); + const [isCollapsible, setIsCollapsible] = useState(false); + const [menuItems, setMenuItems] = useState([ + { id: 1, label: "Home", icon: HomeIcon, link: "/" }, + { id: 2, label: "Search", icon: SearchIcon, link: "/search" }, + { id: 3, label: "Create document", icon: CreateIcon, link: "/create-document" } + ]); + const [token, setToken] = useState(""); + + useEffect(() => { + setToken(() => localStorage.getItem("token")) + }, []) + + useEffect(() => { + if (token) { + const fetchData = async () => { + const res = await fetch("http://localhost:8000/api/documents", { + method: "GET", + headers: { + 'Authorization': `Bearer ${token}` + } + }) + let json = await res.json(); + let list = [ + { id: 1, label: "Home", icon: HomeIcon, link: "/" }, + { id: 2, label: "Search", icon: SearchIcon, link: "/search" }, + { id: 3, label: "Create document", icon: CreateIcon, link: "/create-document" } + ] + json.forEach((doc) => { + list.push({ + id: doc["id"], + label: doc["name"], + icon: ArticleIcon, + link: `/documents/${doc["id"]}` + }) + }) + + setMenuItems(() => list) + } + + fetchData() + } + }, [token]) + + const router = useRouter(); + + const activeMenu = useMemo( + () => menuItems.find((menu) => { + if (!router.query.id || router.query.id === 'undefined') { + return menu.link === router.pathname + } else if (!(menu.id === 1 || menu.id === 2 || menu.id === 3)) { + return menu.id.toString() === router.query.id + } + return true + }), + [menuItems, router.query.id, router.pathname] + ); + + const wrapperClasses = classNames( + "h-screen px-4 pt-8 pb-4 bg-light flex justify-between flex-col", + { + ["w-80"]: !toggleCollapse, + ["w-20"]: toggleCollapse, + } + ); + + const collapseIconClasses = classNames( + "p-4 rounded bg-light-lighter absolute right-0", + { + "rotate-180": toggleCollapse, + } + ); + + const getNavItemClasses = (menu) => { + return classNames( + "flex items-center cursor-pointer hover:bg-light-lighter rounded w-full overflow-hidden whitespace-nowrap", + { + ["bg-light-lighter"]: activeMenu.id === menu.id, + } + ); + }; + + const onMouseOver = () => { + setIsCollapsible(!isCollapsible); + }; + + const handleSidebarToggle = () => { + setToggleCollapse(!toggleCollapse); + }; + + const handleSubmit = async (event) => { + event.preventDefault() + + const res = await fetch("http://localhost:8000/api/token", { + method: "DELETE", + headers: { + 'Authorization': `Bearer ${token}` + } + }); + + localStorage.removeItem("token") + router.push("/") + } + + return ( + <div + className={wrapperClasses} + onMouseEnter={onMouseOver} + onMouseLeave={onMouseOver} + style={{ transition: "width 300ms cubic-bezier(0.2, 0, 0, 1) 0s" }} + > + <div className="flex flex-col"> + <div className="flex items-center justify-between relative"> + <div className="flex items-center pl-1 gap-4"> + <LogoIcon /> + <span + className={classNames("mt-2 text-lg font-medium text-text", { + hidden: toggleCollapse, + })} + > + BSition + </span> + </div> + {isCollapsible && ( + <button + className={collapseIconClasses} + onClick={handleSidebarToggle} + > + <CollapsIcon /> + </button> + )} + + </div> + + <div className="flex flex-col items-start mt-24"> + {menuItems.map(({ icon: Icon, ...menu }) => { + const classes = getNavItemClasses(menu); + return ( + <div className={classes} key={menu.id}> + <Link href={menu.link}> + <a className="flex py-4 px-3 items-center w-full h-full"> + <div style={{ width: "2.5rem" }}> + <Icon /> + </div> + {!toggleCollapse && ( + <span + className={classNames( + "text-md font-medium text-text-light" + )} + > + {menu.label} + </span> + )} + </a> + </Link> + </div> + ); + })} + </div> + </div> + + <div className={`${getNavItemClasses({})} px-3 py-4`}> + <div style={{ width: "2.5rem" }}> + <LogoutIcon /> + </div> + {!toggleCollapse && ( + <form onSubmit={handleSubmit}> + <button name="Logout" value="logout"> + <span className={classNames("text-md font-medium text-text-light")}> + Logout + </span> + </button> + </form> + )} + </div> + </div> + ); +}; + +export default Sidebar; diff --git a/bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx b/bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx new file mode 100644 index 0000000..a136b22 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx @@ -0,0 +1,22 @@ +import * as React from "react"; + +function ArticleIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M19 5v14H5V5h14zm0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z" + fill={fill} + /> + <path d="M14 17H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z" fill={fill} /> + </svg> + ); +} + +export default ArticleIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx b/bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx new file mode 100644 index 0000000..706fcb3 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx @@ -0,0 +1,24 @@ +import * as React from "react"; + +function CollapsIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={16} + height={15} + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M8.901 1.768L7.134 0 0 7.134l7.134 7.133L8.9 12.5 3.535 7.134l5.366-5.367z" + fill={fill} + /> + <path + d="M13.384 0L6.25 7.134l7.134 7.133L15.15 12.5 9.785 7.134l5.366-5.367L13.384 0z" + fill={fill} + /> + </svg> + ); +} + +export default CollapsIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx b/bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx new file mode 100644 index 0000000..6c724cb --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function CreateIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 16 16" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z" + fill={fill} + /> + </svg> + ); +} + +export default CreateIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx b/bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx new file mode 100644 index 0000000..ab1485a --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function DeleteIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M7 4a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v2h4a1 1 0 1 1 0 2h-1.069l-.867 12.142A2 2 0 0 1 17.069 22H6.93a2 2 0 0 1-1.995-1.858L4.07 8H3a1 1 0 0 1 0-2h4V4zm2 2h6V4H9v2zM6.074 8l.857 12H17.07l.857-12H6.074z" + fill={fill} + /> + </svg> + ); +} + +export default DeleteIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx b/bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx new file mode 100644 index 0000000..2f6e04a --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function HomeIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M3 13h1v7c0 1.103.897 2 2 2h12c1.103 0 2-.897 2-2v-7h1a1.001 1.001 0 00.707-1.707l-9-9a1 1 0 00-1.414 0l-9 9A1 1 0 003 13zm7 7v-5h4v5h-4zm2-15.586l6 6V15l.001 5H16v-5c0-1.103-.897-2-2-2h-4c-1.103 0-2 .897-2 2v5H6v-9.586l6-6z" + fill={fill} + /> + </svg> + ); +} + +export default HomeIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/LockIcon.jsx b/bsition/frontend/nextjs/src/components/icons/LockIcon.jsx new file mode 100644 index 0000000..c57c82a --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/LockIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function LockIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="-2.5 -2.5 21.5 21.5" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z" + fill={fill} + /> + </svg> + ); +} + +export default LockIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/Logo.jsx b/bsition/frontend/nextjs/src/components/icons/Logo.jsx new file mode 100644 index 0000000..1a44f8a --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/Logo.jsx @@ -0,0 +1,41 @@ +import * as React from "react"; + +function Logo({ fill = "#3B81F6", ...rest }) { + return ( + <svg version="1.0" xmlns="http://www.w3.org/2000/svg" + width="40.000000pt" height="40.000000pt" viewBox="0 0 500.000000 500.000000" + preserveAspectRatio="xMidYMid meet"> + +<g transform="translate(0.000000,500.000000) scale(0.100000,-0.100000)" +fill="#000000" stroke="none"> +<path d="M3020 4444 c-138 -12 -603 -47 -855 -64 -159 -11 -371 -27 -470 -35 +-99 -8 -283 -21 -410 -30 -500 -33 -538 -40 -595 -98 -71 -71 -65 49 -65 +-1387 l0 -1295 42 -80 c24 -44 85 -134 136 -200 51 -66 182 -235 291 -375 223 +-288 253 -315 357 -330 35 -5 96 -7 134 -4 39 2 295 18 570 34 748 45 1638 98 +1833 110 258 16 330 45 379 155 17 38 18 115 21 1400 2 748 0 1385 -3 1415 -6 +50 -12 60 -58 105 -29 28 -84 71 -122 98 -39 26 -95 65 -125 86 -356 253 -618 +431 -673 460 -68 35 -70 36 -205 37 -76 1 -157 0 -182 -2z m318 -237 c32 -13 +143 -85 250 -162 106 -77 206 -148 222 -158 27 -17 48 -52 37 -63 -2 -2 -157 +-13 -343 -24 -339 -19 -558 -32 -1504 -91 -278 -17 -529 -29 -558 -26 -29 3 +-72 16 -96 30 -78 44 -396 299 -396 318 0 35 40 48 185 59 77 6 196 15 265 20 +69 6 251 19 405 30 398 27 940 67 1145 84 218 18 312 14 388 -17z m744 -658 +c9 -5 24 -28 32 -51 15 -39 16 -158 14 -1233 -3 -1116 -4 -1192 -21 -1222 -23 +-44 -62 -62 -144 -68 -81 -7 -822 -50 -1108 -65 -110 -6 -342 -19 -515 -30 +-820 -50 -853 -50 -900 -5 -17 16 -35 45 -41 65 -6 23 -9 431 -7 1217 3 1181 +3 1182 24 1210 11 15 32 33 46 40 13 7 108 17 214 23 104 6 374 22 599 35 226 +14 457 27 515 30 58 3 290 17 515 31 757 46 734 45 777 23z"/> +<path d="M1950 3121 l0 -140 88 -3 87 -3 3 -766 c2 -759 2 -766 -18 -792 -23 +-30 -74 -47 -137 -47 l-43 0 0 -130 0 -130 503 0 c622 0 729 11 901 94 204 99 +310 264 323 503 15 278 -97 443 -376 550 -22 8 -19 11 42 51 151 98 227 240 +227 422 -1 270 -146 439 -434 502 -83 18 -139 21 -628 25 l-538 5 0 -141z +m1030 -185 c63 -24 116 -62 142 -105 20 -31 23 -49 23 -141 0 -98 -2 -109 -30 +-160 -65 -119 -182 -159 -467 -160 l-128 0 0 296 0 296 208 -4 c161 -4 217 -9 +252 -22z m-7 -861 c165 -35 250 -124 272 -285 8 -56 -10 -161 -35 -211 -28 +-54 -102 -114 -173 -140 -56 -20 -85 -23 -289 -27 l-228 -4 0 341 0 341 193 0 +c128 0 215 -5 260 -15z"/> +</g> +</svg> + ); +} + +export default Logo; diff --git a/bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx b/bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx new file mode 100644 index 0000000..42f5464 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function LogoutIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={16} + height={19} + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M8 19c4.411 0 8-3.589 8-8 0-3.35-2.072-6.22-5-7.41v2.222A6 6 0 0114 11c0 3.31-2.691 6-6 6s-6-2.69-6-6a5.999 5.999 0 013-5.188V3.59C2.072 4.78 0 7.65 0 11c0 4.411 3.589 8 8 8z" + fill={fill} + /> + <path d="M7 0h2v10H7V0z" fill={fill} /> + </svg> + ); +} + +export default LogoutIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx b/bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx new file mode 100644 index 0000000..aaf2f5b --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function ManageIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="-2.5 -2.5 21.5 21.5" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M.102 2.223A3.004 3.004 0 0 0 3.78 5.897l6.341 6.252A3.003 3.003 0 0 0 13 16a3 3 0 1 0-.851-5.878L5.897 3.781A3.004 3.004 0 0 0 2.223.1l2.141 2.142L4 4l-1.757.364L.102 2.223zm13.37 9.019.528.026.287.445.445.287.026.529L15 13l-.242.471-.026.529-.445.287-.287.445-.529.026L13 15l-.471-.242-.529-.026-.287-.445-.445-.287-.026-.529L11 13l.242-.471.026-.529.445-.287.287-.445.529-.026L13 11l.471.242z" + fill={fill} + /> + </svg> + ); +} + +export default ManageIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx b/bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx new file mode 100644 index 0000000..bd5251e --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function OptionsIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="-2.5 -2.5 21.5 21.5" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z" + fill={fill} + /> + </svg> + ); +} + +export default OptionsIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx b/bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx new file mode 100644 index 0000000..4a7a72b --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function PublicIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M221.6,173.3A102.9,102.9,0,0,0,232,128,104.2,104.2,0,0,0,154.8,27.5h-.5A103.8,103.8,0,0,0,60.4,49l-1.3,1.2A103.9,103.9,0,0,0,128,232h2.4A104.3,104.3,0,0,0,221,174.6h0ZM216,128a89.3,89.3,0,0,1-5.5,30.7l-46.4-28.5a16,16,0,0,0-6.3-2.3l-22.8-3a16.1,16.1,0,0,0-15.3,6.8h-8.6l-3.8-7.9a16.2,16.2,0,0,0-11-8.7l-6.6-1.4,2.5-5.9a8.1,8.1,0,0,1,7.4-4.9h16.1a16.1,16.1,0,0,0,7.7-2l12.2-6.8a16.1,16.1,0,0,0,3-2.1l26.9-24.4A15.7,15.7,0,0,0,170,50.7,88,88,0,0,1,216,128ZM40,128a87.1,87.1,0,0,1,9.5-39.7l10.4,27.9a16.1,16.1,0,0,0,11.6,10l5.5,1.2h.1l12,2.6a7.8,7.8,0,0,1,5.5,4.3l2.1,4.4a16.1,16.1,0,0,0,14.4,9h1.2l-7.7,17.2a15.9,15.9,0,0,0,2.8,17.4l16.1,17.4a8.3,8.3,0,0,1,2,6.9l-1.8,9.3A88.1,88.1,0,0,1,40,128Z" + fill={fill} + /> + </svg> + ); +} + +export default PublicIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx b/bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx new file mode 100644 index 0000000..f802ccc --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function SearchIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="-2 -2 22 22" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z" + fill={fill} + /> + </svg> + ); +} + +export default SearchIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx b/bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx new file mode 100644 index 0000000..6d8f495 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +function ShareIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="-2.5 -2.5 21.5 21.5" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M11 2.5a2.5 2.5 0 1 1 .603 1.628l-6.718 3.12a2.499 2.499 0 0 1 0 1.504l6.718 3.12a2.5 2.5 0 1 1-.488.876l-6.718-3.12a2.5 2.5 0 1 1 0-3.256l6.718-3.12A2.5 2.5 0 0 1 11 2.5z" + fill={fill} + /> + </svg> + ); +} + +export default ShareIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx b/bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx new file mode 100644 index 0000000..25efc45 --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx @@ -0,0 +1,24 @@ +import * as React from "react"; + +function UsersIcon({ stroke = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path + d="M12 4.354a4 4 0 110 5.292V4.354zM15 21H3v-1a6 6 0 1112 0v1zm0 0h6v-1a6 6 0 00-9-5.197L15 21zM13 7a4 4 0 11-8 0 4 4 0 018 0v0z" + stroke={stroke} + strokeWidth={2} + strokeLinecap="round" + strokeLinejoin="round" + /> + </svg> + ); +} + +export default UsersIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx b/bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx new file mode 100644 index 0000000..86a6a6e --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx @@ -0,0 +1,22 @@ +import * as React from "react"; + +function VideosIcon({ fill = "#6C7281", ...rest }) { + return ( + <svg + width={24} + height={24} + fill="none" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + {...rest} + > + <path d="M4 8H2v12a2 2 0 002 2h12v-2H4V8z" fill={fill} /> + <path + d="M20 2H8a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V4a2 2 0 00-2-2zm-9 12V6l7 4-7 4z" + fill={fill} + /> + </svg> + ); +} + +export default VideosIcon; diff --git a/bsition/frontend/nextjs/src/components/icons/index.js b/bsition/frontend/nextjs/src/components/icons/index.js new file mode 100644 index 0000000..e06a7fe --- /dev/null +++ b/bsition/frontend/nextjs/src/components/icons/index.js @@ -0,0 +1,16 @@ +export { default as ArticleIcon } from "./ArticleIcon"; +export { default as HomeIcon } from "./HomeIcon"; +export { default as UsersIcon } from "./UsersIcon"; +export { default as VideosIcon } from "./VideosIcon"; +export { default as CollapsIcon } from "./CollapsIcon"; +export { default as LogoIcon } from "./Logo"; +export { default as LogoutIcon } from "./LogoutIcon"; +export { default as SearchIcon } from "./SearchIcon"; +export { default as ShareIcon } from "./ShareIcon"; +export { default as LockIcon } from "./LockIcon"; +export { default as PublicIcon } from "./PublicIcon"; +export { default as DeleteIcon } from "./DeleteIcon"; +export { default as OptionsIcon } from "./OptionsIcon"; +export { default as ManageIcon } from "./ManageIcon"; +export { default as CreateIcon } from "./CreateIcon"; + diff --git a/bsition/frontend/nextjs/src/pages/_app.tsx b/bsition/frontend/nextjs/src/pages/_app.tsx new file mode 100644 index 0000000..7a4ff3e --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/_app.tsx @@ -0,0 +1,17 @@ +import Head from 'next/head' +import {AppProps} from 'next/app' +import '../styles/index.css' + +function MyApp({Component, pageProps}: AppProps) { + return ( + <> + <Head> + <title>BSition</title> + <meta name="viewport" content="initial-scale=1.0, width=device-width"/> + </Head> + <Component {...pageProps} /> + </> + ) +} + +export default MyApp \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/pages/api/socket.tsx b/bsition/frontend/nextjs/src/pages/api/socket.tsx new file mode 100644 index 0000000..96b2611 --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/api/socket.tsx @@ -0,0 +1,22 @@ +import { Server } from "socket.io"; +import messageHandler from "../../utils/sockets/messageHandler"; + +export default function SocketHandler(req, res) { + if (res.socket.server.io) { + console.log("Already set up"); + res.end(); + return; + } + + const io = new Server(res.socket.server); + res.socket.server.io = io; + + const onConnection = (socket) => { + messageHandler(io, socket); + }; + + io.on("connection", onConnection); + + console.log("Setting up socket"); + res.end(); +} diff --git a/bsition/frontend/nextjs/src/pages/create-document.tsx b/bsition/frontend/nextjs/src/pages/create-document.tsx new file mode 100644 index 0000000..f3b47d9 --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/create-document.tsx @@ -0,0 +1,53 @@ +import React, {useEffect, useState} from "react"; +import {useRouter} from "next/router"; +import Layout from "../components/Layout"; +import Link from "next/link"; +import classNames from "classnames"; + +export default function CreateDocument() { + const router = useRouter(); + + const [token, setToken] = useState(""); + const [user, setUser] = useState(""); + + useEffect(() => { + setToken(() => localStorage.getItem("token")) + setUser(() => localStorage.getItem("user")) + }, []) + + const handleSubmit = async (event) => { + event.preventDefault() + + let data = { + name: event.target.name.value, + } + + const JSONdata = JSON.stringify(data) + + const res = await fetch("http://localhost:8000/api/documents", { + method: "POST", + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSONdata + }) + let json = await res.json(); + router.push(`/documents/${json["id"]}`) + } + + return ( + <Layout> + <div className="flex items-center justify-center w-full h-full"> + <form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}> + <div> + <input type="text" id="name" name="name" required placeholder="name" + style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/> + </div> + + <button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Create</button> + </form> + </div> + </Layout> + ); +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/pages/documents/[id].tsx b/bsition/frontend/nextjs/src/pages/documents/[id].tsx new file mode 100644 index 0000000..cabf38c --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/documents/[id].tsx @@ -0,0 +1,134 @@ +import io from "socket.io-client"; +import { useState, useEffect } from "react"; +import { useRouter } from "next/router"; +import Layout from "../../components/Layout"; +import { + OptionsIcon, + DeleteIcon, + LockIcon, + PublicIcon, + ShareIcon, + ManageIcon +} from "../../components/icons"; +import Link from "next/link"; + +let socket; + +export default function Document() { + const router = useRouter(); + + const [text, setText] = useState(""); + const [token, setToken] = useState(""); + const [title, setTitle] = useState(""); + + useEffect(() => { + socketInitializer(); + }, [router.query.id]); + + useEffect(() => { + setToken(() => localStorage.getItem("token")) + }, []) + + useEffect(() => { + if (token && router.query.id) { + const fetchData = async () => { + const res = await fetch(`http://localhost:8000/api/documents/${router.query.id}`, { + method: "GET", + headers: { + 'Authorization': `Bearer ${token}` + } + }) + const json = await res.json(); + setText(() => json["data"]) + setTitle(() => json["name"]) + } + + fetchData() + } + }, [token, router.query.id]) + + useEffect(() => { + if (token && router.query.id) { + const interval = setInterval(() => { + fetch(`http://localhost:8000/api/documents/${router.query.id}`, { + method: 'PUT', + body: `{"data": "${text}"}`, + headers: { + 'Content-type': 'application/json', + 'Authorization': `Bearer ${token}` + } + }) + }, 500); + + return () => clearInterval(interval); + } + }, [token, text, router.query.id]) + + const socketInitializer = async () => { + await fetch("/api/socket"); + + socket = io(); + + socket.emit('create', router.query.id); + + socket.on("newIncomingText", (text) => { + setText(() => text); + console.log('text' + text); + }); + }; + + const sendText = async () => { + socket.emit("createdText", text, router.query.id); + setText(() => text); + }; + + const handleKey = () => { + if (text) { + sendText(); + } + }; + + let access = router.query.id + "/access" + + return ( + <Layout> + <div style={{height: "50px", justifyContent: "space-between"}} + className="align-center flex"> + <span className="docTitle"> + {title} + </span> + <div className="dropdown"> + <OptionsIcon onClick={(e) => { + document.getElementById("myDropdown").classList.toggle("show"); + + window.onclick = function(event) { + if (!event.target.matches('.dropbtn')) { + var dropdowns = document.getElementsByClassName("dropdown-content"); + var i; + for (i = 0; i < dropdowns.length; i++) { + var openDropdown = dropdowns[i]; + if (openDropdown.classList.contains('show')) { + openDropdown.classList.remove('show'); + } + } + }}}} className="dropbtn"></OptionsIcon> + <div id="myDropdown" className="dropdown-content"> + <Link href={access}> + <div className="flex flex-row items-center justify-start align-center menu-opt"><ManageIcon/><span>Manage access</span></div> + </Link> + <a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><ShareIcon/><span>Share</span></div></a> + <a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><LockIcon/><span>Public/private</span></div></a> + <a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><DeleteIcon/><span>Delete document</span></div></a> + </div> + </div> + </div> + <textarea + className="document_area" + placeholder="Type..." + onKeyUp={handleKey} + value={text} + onChange={(e) => setText(e.target.value)} + /> + </Layout> + ); +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx b/bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx new file mode 100644 index 0000000..0ef8365 --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx @@ -0,0 +1,133 @@ +import React, { useState, useEffect } from "react"; +import { useRouter } from "next/router"; +import Layout from "../../../components/Layout"; +import { + OptionsIcon, + DeleteIcon, + LockIcon, + PublicIcon, + ShareIcon, + ManageIcon +} from "../../../components/icons"; +import Link from "next/link"; +import classNames from "classnames"; + +let socket; + +export default function Document() { + const router = useRouter(); + + const [text, setText] = useState(""); + const [token, setToken] = useState(""); + const [users, setUsers] = useState([]); + + useEffect(() => { + setToken(() => localStorage.getItem("token")) + }, []) + + useEffect(() => { + if (token && router.query.id) { + const fetchData = async () => { + const res = await fetch(`http://localhost:8000/api/documents/${router.query.id}/access`, { + method: "GET", + headers: { + 'Authorization': `Bearer ${token}` + } + }) + const json = await res.json(); + console.log(json) + let list = [] + json.forEach((user) => { + list.push({ + id: user[0], + username: user[1], + access: user[2] + }) + }) + setUsers(() => list) + } + + fetchData() + } + }, [token, router.query.id]) + + useEffect(() => { + if (token && router.query.id) { + const interval = setInterval(() => { + fetch(`http://localhost:8000/api/documents/${router.query.id}`, { + method: 'PUT', + body: `{"data": "${text}"}`, + headers: { + 'Content-type': 'application/json', + 'Authorization': `Bearer ${token}` + } + }) + }, 500); + + return () => clearInterval(interval); + } + }, [token, text, router.query.id]) + + const handleSubmit = async (event) => { + event.preventDefault() + + let data = { + name: event.target.name.value, + } + + const JSONdata = JSON.stringify(data) + + const res = await fetch("http://localhost:8000/api/documents", { + method: "POST", + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSONdata + }) + let json = await res.json(); + } + + + return ( + <Layout> + <div style={{height: "50px", justifyContent: "space-between"}} + className="align-center flex"> + <table> + <tr> + <th>Username</th> + <th>Access</th> + </tr> + {users.map(({ icon: Icon, ...user }) => { + return ( + <> + <tr style={{color: "black"}}> + <td>{user.username}</td> + <td> + <select style={{padding: "4px"}} value={user.access} onChange={handleSubmit}> + <option value={1} label="Full-access"></option> + <option value={2} label="Edit"></option> + <option value={3} label="Read-only"></option> + </select> + + </td> + </tr> + + <div className="flex items-center justify-center w-full h-full"> + {/*<form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>*/} + <div> + <input type="text" id="name" name="name" required placeholder="name" + style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/> + </div> + + <button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Create</button> + {/*</form>*/} + </div> + </> + ); + })} + </table> + </div> + </Layout> + ); +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/pages/index.tsx b/bsition/frontend/nextjs/src/pages/index.tsx new file mode 100644 index 0000000..ea96ec7 --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/index.tsx @@ -0,0 +1,36 @@ +import Layout from "../components/Layout"; +import {useRouter} from "next/router"; +import {useEffect, useState} from "react"; + +export default function Home() { + const router = useRouter(); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + const token = localStorage.getItem("token"); + if (router.pathname !== "/login" && (!token || token === "undefined")) { + router.push("/login"); + } else { + setIsLoading(false) + } + }, []); + + if (isLoading) { + return <></> + } + + return <Layout> + <div className="flex flex-col justify-center h-full w-full align-center items-center"> + <div style={{width: "fit-content"}}> + <h1 style={{fontSize: "xxx-large"}}>BSition</h1> + <h3 style={{margin: "0"}}>Created by:</h3> + <h2 style={{margin: "0"}}>Bottler</h2> + <ul style={{margin: "0"}}> + <li>Barmasch, Juan MartÃn</li> + <li>Bellver, Ezequiel</li> + <li>Lo Coco, Santiago</li> + </ul> + </div> + </div> + </Layout>; +} diff --git a/bsition/frontend/nextjs/src/pages/login.tsx b/bsition/frontend/nextjs/src/pages/login.tsx new file mode 100644 index 0000000..0e7779a --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/login.tsx @@ -0,0 +1,55 @@ +import React, {useState} from "react"; +import {useRouter} from "next/router"; +import {Input} from "postcss"; + +export default function Login() { + const router = useRouter(); + + const handleSubmit = async (event) => { + event.preventDefault() + + let formData = new FormData(); + formData.append("username", event.target.username.value) + formData.append("password", event.target.password.value) + + const res = await fetch("http://localhost:8000/api/token", {method: 'POST', body: formData}) + const json = await res.json(); + + if (res.status == 202) { + localStorage.setItem("token", json["access_token"]) + const res = await fetch("http://localhost:8000/api/users/me", { + method: 'GET', + headers: { + 'Authorization': `Bearer ${json["access_token"]}` + } + }) + const aux = await res.json(); + + if (res.status == 200) { + console.log(aux) + localStorage.setItem("user", aux[0]) + } + + router.push("/") + } else { + alert('Fail') + } + } + + return ( + <div className="flex items-center justify-center w-full h-full" style={{marginTop: "30%"}}> + <form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}> + <div> + <input type="text" id="username" name="username" required placeholder="username" + style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/> + </div> + <div> + <input type="password" id="password" name="password" required placeholder="password" + style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/> + </div> + + <button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Log in</button> + </form> + </div> + ); +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/pages/search.tsx b/bsition/frontend/nextjs/src/pages/search.tsx new file mode 100644 index 0000000..5d688fe --- /dev/null +++ b/bsition/frontend/nextjs/src/pages/search.tsx @@ -0,0 +1,98 @@ +import React, {useEffect, useState} from "react"; +import {useRouter} from "next/router"; +import Layout from "../components/Layout"; +import Link from "next/link"; +import classNames from "classnames"; + +export default function Search() { + const router = useRouter(); + + const [token, setToken] = useState(""); + const [search, setSearch] = useState(""); + const [menuItems, setMenuItems] = useState([{id: 1, label: "", link: "/"}]); + + useEffect(() => { + setToken(() => localStorage.getItem("token")) + }, []) + + const handleSubmit = async (event) => { + event.preventDefault() + + const res = await fetch("http://localhost:8000/api/documents?" + new URLSearchParams( + {query: "*" + event.target.search.value + "*"} + ), { + method: "GET", + headers: { + 'Authorization': `Bearer ${token}` + } + }) + let json = await res.json(); + let list = [] + json.forEach((doc) => { + let highlight = doc["highlight"].replaceAll('\'', '').replaceAll('[', '').replaceAll(']', '') + let initial = highlight.indexOf('<em>') + let end = highlight.indexOf('</em>') + let first_str, second_str + if (highlight.length < end + 15) { + second_str = highlight.substring(end, highlight.length) + } else { + second_str = highlight.substring(end, end + 15) + } + if (initial - 10 < 0) { + first_str = highlight.substring(0, initial) + } else { + first_str = highlight.substring(0, initial - 10) + } + highlight = highlight.substring(initial + 4, end) + list.push({ + id: doc["id"], + label: doc["name"], + first: first_str.replace('<em>', ''), + bold: highlight, + second: second_str.replace('</em>', ''), + link: `/documents/${doc["id"]}` + }) + }) + + setMenuItems(() => list) + } + + return ( + <Layout> + <form onSubmit={handleSubmit}> + <input type="text" id="search" name="search" required style={{color: "black", padding: "2px 4px"}}/> + + <button type="submit">Search</button> + </form> + + {menuItems && ( + <div className="flex flex-col items-start mt-24"> + {menuItems.map(({...menu}) => { + return ( + <div key={menu.id}> + <span> + + <Link href={menu.link}> + <a className="flex py-4 px-3 items-center w-full h-full"> + <div style={{width: "2.5rem"}}> + </div> + <span + className={classNames( + "text-md font-medium text-text-light" + )} + > + {menu.label} + </span> + </a> + </Link> + <p>{menu.first}<b>{menu.bold}</b>{menu.second}</p> + </span> + </div> + ); + })} + </div> + )} + + </Layout> + ); +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/styles/Home.module.css b/bsition/frontend/nextjs/src/styles/Home.module.css new file mode 100644 index 0000000..32a57d5 --- /dev/null +++ b/bsition/frontend/nextjs/src/styles/Home.module.css @@ -0,0 +1,116 @@ +.container { + padding: 0 2rem; +} + +.main { + min-height: 100vh; + padding: 4rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + display: flex; + flex: 1; + padding: 2rem 0; + border-top: 1px solid #eaeaea; + justify-content: center; + align-items: center; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; + flex-grow: 1; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + margin: 4rem 0; + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + max-width: 300px; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/bsition/frontend/nextjs/src/styles/index.css b/bsition/frontend/nextjs/src/styles/index.css new file mode 100644 index 0000000..1ee3e9c --- /dev/null +++ b/bsition/frontend/nextjs/src/styles/index.css @@ -0,0 +1,103 @@ +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; + +/* Your own custom component styles */ + +.document_area { + width: 100%; + height: calc(100% - 50px); + /*margin: 40px;*/ + border: none; + outline: none; + resize: none; + color: black; + padding: 10px; +} + +.docTitle { + color: black; + font-size: large; + font-weight: bold; +} + + +.dropbtn { + width: 40px; + height: 40px; + border-radius: 100%; + padding: 3px; + border: none; + stroke: #404040; + cursor: pointer; +} + +.dropbtn:hover, .dropbtn:focus { + border-radius: 100%; + background-color: #419de8; +} + +.dropdown { + float: right; + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + background-color: white; + min-width: 220px; + overflow: auto; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + right: 0; + z-index: 1; +} + +.dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; +} + +.dropdown a:hover {background-color: #ddd;} + +.show {display: block;} + + +svg { + display: inline; +} + +.login-form div { + margin: 10px; +} + +.menu-opt span { + margin-left: 4px; +} + +h1 { + all: revert; +} + +h2 { + all: revert; +} + +h3 { + all: revert; +} + +ul { + all: revert; +} + +li { + all: revert; +} + +table { + all: revert +} \ No newline at end of file diff --git a/bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx b/bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx new file mode 100644 index 0000000..d6091dc --- /dev/null +++ b/bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx @@ -0,0 +1,13 @@ +export default (io, socket) => { + const createdText = (text, room) => { + console.log(room); + console.log(text); + socket.to(room).emit("newIncomingText", text); + }; + + socket.on('create', function(room) { + socket.join(room); + }); + + socket.on("createdText", createdText); +}; diff --git a/bsition/frontend/nextjs/tailwind.config.js b/bsition/frontend/nextjs/tailwind.config.js new file mode 100644 index 0000000..eb0b01e --- /dev/null +++ b/bsition/frontend/nextjs/tailwind.config.js @@ -0,0 +1,28 @@ +const defaultTheme = require('tailwindcss/defaultConfig'); + +module.exports = { + content: [ + './src/components/**/*.{ts,tsx,js,jsx}', + './src/pages/**/*.{ts,tsx,js,jsx}', + './src/pages/login.tsx' + ], + theme: { + ...defaultTheme, + colors: { + ...defaultTheme.colors, + primary: "#71aaff", + white: '#ffffff', + text: { + DEFAULT: "#1F2937", + light: "#6C7281", + }, + light: { + DEFAULT: "#FAFBFC", + lighter: "#F3F4F6", + }, + }, + extend: {}, + }, + variants: {}, + plugins: [], +} diff --git a/bsition/frontend/nextjs/tsconfig.json b/bsition/frontend/nextjs/tsconfig.json new file mode 100644 index 0000000..568e45d --- /dev/null +++ b/bsition/frontend/nextjs/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true + }, + "exclude": [ + "node_modules" + ], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/bsition/frontend/nextjs/yarn.lock b/bsition/frontend/nextjs/yarn.lock new file mode 100644 index 0000000..6ea3da7 --- /dev/null +++ b/bsition/frontend/nextjs/yarn.lock @@ -0,0 +1,964 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + "integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==" + "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + "version" "7.12.11" + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.15.7": + "integrity" "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" + "version" "7.15.7" + +"@babel/highlight@^7.10.4": + "integrity" "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==" + "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz" + "version" "7.16.0" + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" + +"@next/env@12.1.0": + "integrity" "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" + "resolved" "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz" + "version" "12.1.0" + +"@next/swc-linux-x64-gnu@12.1.0": + "integrity" "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==" + "resolved" "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz" + "version" "12.1.0" + +"@next/swc-linux-x64-musl@12.1.0": + "integrity" "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==" + "resolved" "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz" + "version" "12.1.0" + +"@nodelib/fs.scandir@2.1.5": + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + "version" "2.1.5" + dependencies: + "@nodelib/fs.stat" "2.0.5" + "run-parallel" "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" + +"@nodelib/fs.walk@^1.2.3": + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" + dependencies: + "@nodelib/fs.scandir" "2.1.5" + "fastq" "^1.6.0" + +"@socket.io/component-emitter@~3.1.0": + "integrity" "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "resolved" "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" + "version" "3.1.0" + +"@types/cookie@^0.4.1": + "integrity" "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + "resolved" "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" + "version" "0.4.1" + +"@types/cors@^2.8.12": + "integrity" "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==" + "resolved" "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz" + "version" "2.8.13" + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^17.0.21", "@types/node@>=10.0.0": + "integrity" "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" + "version" "17.0.21" + +"@types/parse-json@^4.0.0": + "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + "version" "4.0.0" + +"@types/prop-types@*": + "integrity" "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz" + "version" "15.7.3" + +"@types/react@^17.0.39": + "integrity" "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==" + "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz" + "version" "17.0.39" + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + "csstype" "^3.0.2" + +"@types/scheduler@*": + "integrity" "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz" + "version" "0.16.1" + +"accepts@~1.3.4": + "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==" + "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + "version" "1.3.8" + dependencies: + "mime-types" "~2.1.34" + "negotiator" "0.6.3" + +"acorn-node@^1.6.1": + "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==" + "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + "version" "1.8.2" + dependencies: + "acorn" "^7.0.0" + "acorn-walk" "^7.0.0" + "xtend" "^4.0.2" + +"acorn-walk@^7.0.0": + "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + "version" "7.2.0" + +"acorn@^7.0.0": + "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + "version" "7.4.1" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^4.1.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"anymatch@~3.1.2": + "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"arg@^5.0.1": + "integrity" "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" + "version" "5.0.1" + +"autoprefixer@^10.0.2", "autoprefixer@^10.4.2": + "integrity" "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==" + "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz" + "version" "10.4.2" + dependencies: + "browserslist" "^4.19.1" + "caniuse-lite" "^1.0.30001297" + "fraction.js" "^4.1.2" + "normalize-range" "^0.1.2" + "picocolors" "^1.0.0" + "postcss-value-parser" "^4.2.0" + +"base64id@~2.0.0", "base64id@2.0.0": + "integrity" "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + "resolved" "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" + "version" "2.0.0" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"braces@^3.0.1", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browserslist@^4.19.1": + "integrity" "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==" + "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz" + "version" "4.19.3" + dependencies: + "caniuse-lite" "^1.0.30001312" + "electron-to-chromium" "^1.4.71" + "escalade" "^3.1.1" + "node-releases" "^2.0.2" + "picocolors" "^1.0.0" + +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"camelcase-css@^2.0.1": + "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + "version" "2.0.1" + +"caniuse-lite@^1.0.30001283", "caniuse-lite@^1.0.30001297", "caniuse-lite@^1.0.30001312": + "integrity" "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz" + "version" "1.0.30001312" + +"chalk@^2.0.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chalk@^4.1.2": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "^4.1.0" + "supports-color" "^7.1.0" + +"chokidar@^3.5.3": + "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + "version" "3.5.3" + dependencies: + "anymatch" "~3.1.2" + "braces" "~3.0.2" + "glob-parent" "~5.1.2" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.6.0" + optionalDependencies: + "fsevents" "~2.3.2" + +"classnames@^2.3.1": + "integrity" "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + "resolved" "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" + "version" "2.3.2" + +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@^1.1.4", "color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"cookie@~0.4.1": + "integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + "version" "0.4.2" + +"cors@~2.8.5": + "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==" + "resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + "version" "2.8.5" + dependencies: + "object-assign" "^4" + "vary" "^1" + +"cosmiconfig@^7.0.1": + "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==" + "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "@types/parse-json" "^4.0.0" + "import-fresh" "^3.2.1" + "parse-json" "^5.0.0" + "path-type" "^4.0.0" + "yaml" "^1.10.0" + +"cssesc@^3.0.0": + "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + "version" "3.0.0" + +"csstype@^3.0.2": + "integrity" "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" + "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz" + "version" "3.0.5" + +"debug@~4.3.1", "debug@~4.3.2": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"defined@^1.0.0": + "integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" + "version" "1.0.0" + +"detective@^5.2.0": + "integrity" "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==" + "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "acorn-node" "^1.6.1" + "defined" "^1.0.0" + "minimist" "^1.1.1" + +"didyoumean@^1.2.2": + "integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + "version" "1.2.2" + +"dlv@^1.1.3": + "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + "version" "1.1.3" + +"electron-to-chromium@^1.4.71": + "integrity" "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==" + "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz" + "version" "1.4.75" + +"engine.io-client@~6.2.3": + "integrity" "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==" + "resolved" "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz" + "version" "6.2.3" + dependencies: + "@socket.io/component-emitter" "~3.1.0" + "debug" "~4.3.1" + "engine.io-parser" "~5.0.3" + "ws" "~8.2.3" + "xmlhttprequest-ssl" "~2.0.0" + +"engine.io-parser@~5.0.3": + "integrity" "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==" + "resolved" "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz" + "version" "5.0.4" + +"engine.io@~6.2.1": + "integrity" "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==" + "resolved" "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz" + "version" "6.2.1" + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + "accepts" "~1.3.4" + "base64id" "2.0.0" + "cookie" "~0.4.1" + "cors" "~2.8.5" + "debug" "~4.3.1" + "engine.io-parser" "~5.0.3" + "ws" "~8.2.3" + +"error-ex@^1.3.1": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "^0.2.1" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"fast-glob@^3.2.11": + "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==" + "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + "version" "3.2.11" + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + "glob-parent" "^5.1.2" + "merge2" "^1.3.0" + "micromatch" "^4.0.4" + +"fastq@^1.6.0": + "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" + "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + "version" "1.13.0" + dependencies: + "reusify" "^1.0.4" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"fraction.js@^4.1.2": + "integrity" "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==" + "resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz" + "version" "4.1.3" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"glob-parent@^5.1.2", "glob-parent@~5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.2": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-flag@^4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"import-cwd@^3.0.0": + "integrity" "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==" + "resolved" "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "import-from" "^3.0.0" + +"import-fresh@^3.2.1": + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"import-from@^3.0.0": + "integrity" "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==" + "resolved" "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "resolve-from" "^5.0.0" + +"is-arrayish@^0.2.1": + "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-core-module@^2.8.1": + "integrity" "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==" + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" + "version" "2.8.1" + dependencies: + "has" "^1.0.3" + +"is-extglob@^2.1.1": + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + "version" "4.0.0" + +"json-parse-even-better-errors@^2.3.0": + "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + "version" "2.3.1" + +"lilconfig@^2.0.3": + "integrity" "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==" + "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz" + "version" "2.0.3" + +"lines-and-columns@^1.1.6": + "integrity" "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" + "version" "1.1.6" + +"loose-envify@^1.1.0": + "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" + "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "js-tokens" "^3.0.0 || ^4.0.0" + +"merge2@^1.3.0": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"micromatch@^4.0.4": + "integrity" "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" + "version" "4.0.4" + dependencies: + "braces" "^3.0.1" + "picomatch" "^2.2.3" + +"mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-types@~2.1.34": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"minimist@^1.1.1": + "integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + "version" "1.2.7" + +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"nanoid@^3.1.30", "nanoid@^3.3.1": + "integrity" "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz" + "version" "3.3.1" + +"negotiator@0.6.3": + "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + "version" "0.6.3" + +"next@12.1.0": + "integrity" "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==" + "resolved" "https://registry.npmjs.org/next/-/next-12.1.0.tgz" + "version" "12.1.0" + dependencies: + "@next/env" "12.1.0" + "caniuse-lite" "^1.0.30001283" + "postcss" "8.4.5" + "styled-jsx" "5.0.0" + "use-subscription" "1.5.1" + optionalDependencies: + "@next/swc-android-arm64" "12.1.0" + "@next/swc-darwin-arm64" "12.1.0" + "@next/swc-darwin-x64" "12.1.0" + "@next/swc-linux-arm-gnueabihf" "12.1.0" + "@next/swc-linux-arm64-gnu" "12.1.0" + "@next/swc-linux-arm64-musl" "12.1.0" + "@next/swc-linux-x64-gnu" "12.1.0" + "@next/swc-linux-x64-musl" "12.1.0" + "@next/swc-win32-arm64-msvc" "12.1.0" + "@next/swc-win32-ia32-msvc" "12.1.0" + "@next/swc-win32-x64-msvc" "12.1.0" + +"node-releases@^2.0.2": + "integrity" "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz" + "version" "2.0.2" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"normalize-range@^0.1.2": + "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + "version" "0.1.2" + +"object-assign@^4", "object-assign@^4.1.1": + "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"object-hash@^2.2.0": + "integrity" "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" + "version" "2.2.0" + +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + +"parse-json@^5.0.0": + "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "@babel/code-frame" "^7.0.0" + "error-ex" "^1.3.1" + "json-parse-even-better-errors" "^2.3.0" + "lines-and-columns" "^1.1.6" + +"path-parse@^1.0.7": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-type@^4.0.0": + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + "version" "4.0.0" + +"picocolors@^1.0.0": + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + "version" "1.0.0" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.3": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"pify@^2.3.0": + "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + "version" "2.3.0" + +"postcss-import@^14.0.2": + "integrity" "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==" + "resolved" "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz" + "version" "14.0.2" + dependencies: + "postcss-value-parser" "^4.0.0" + "read-cache" "^1.0.0" + "resolve" "^1.1.7" + +"postcss-js@^4.0.0": + "integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==" + "resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "camelcase-css" "^2.0.1" + +"postcss-load-config@^3.1.0": + "integrity" "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==" + "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "import-cwd" "^3.0.0" + "lilconfig" "^2.0.3" + "yaml" "^1.10.2" + +"postcss-nested@5.0.6": + "integrity" "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==" + "resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz" + "version" "5.0.6" + dependencies: + "postcss-selector-parser" "^6.0.6" + +"postcss-selector-parser@^6.0.6", "postcss-selector-parser@^6.0.9": + "integrity" "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==" + "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz" + "version" "6.0.9" + dependencies: + "cssesc" "^3.0.0" + "util-deprecate" "^1.0.2" + +"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.2.0": + "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + "version" "4.2.0" + +"postcss@^8.0.0", "postcss@^8.1.0", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.6", "postcss@^8.4.7": + "integrity" "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==" + "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz" + "version" "8.4.7" + dependencies: + "nanoid" "^3.3.1" + "picocolors" "^1.0.0" + "source-map-js" "^1.0.2" + +"postcss@8.4.5": + "integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==" + "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" + "version" "8.4.5" + dependencies: + "nanoid" "^3.1.30" + "picocolors" "^1.0.0" + "source-map-js" "^1.0.1" + +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" + +"quick-lru@^5.1.1": + "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + "version" "5.1.1" + +"react-dom@^17.0.2 || ^18.0.0-0", "react-dom@17.0.2": + "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" + "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" + "version" "17.0.2" + dependencies: + "loose-envify" "^1.1.0" + "object-assign" "^4.1.1" + "scheduler" "^0.20.2" + +"react@^17.0.2 || ^18.0.0-0", "react@>= 16.8.0 || 17.x.x || 18.x.x", "react@17.0.2": + "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" + "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz" + "version" "17.0.2" + dependencies: + "loose-envify" "^1.1.0" + "object-assign" "^4.1.1" + +"read-cache@^1.0.0": + "integrity" "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=" + "resolved" "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "pify" "^2.3.0" + +"readdirp@~3.6.0": + "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "picomatch" "^2.2.1" + +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"resolve-from@^5.0.0": + "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + "version" "5.0.0" + +"resolve@^1.1.7", "resolve@^1.22.0": + "integrity" "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + "version" "1.22.0" + dependencies: + "is-core-module" "^2.8.1" + "path-parse" "^1.0.7" + "supports-preserve-symlinks-flag" "^1.0.0" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"scheduler@^0.20.2": + "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==" + "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" + "version" "0.20.2" + dependencies: + "loose-envify" "^1.1.0" + "object-assign" "^4.1.1" + +"socket.io-adapter@~2.4.0": + "integrity" "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==" + "resolved" "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz" + "version" "2.4.0" + +"socket.io-client@^4.5.1": + "integrity" "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==" + "resolved" "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz" + "version" "4.5.4" + dependencies: + "@socket.io/component-emitter" "~3.1.0" + "debug" "~4.3.2" + "engine.io-client" "~6.2.3" + "socket.io-parser" "~4.2.1" + +"socket.io-parser@~4.2.1": + "integrity" "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==" + "resolved" "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz" + "version" "4.2.1" + dependencies: + "@socket.io/component-emitter" "~3.1.0" + "debug" "~4.3.1" + +"socket.io@^4.5.1": + "integrity" "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==" + "resolved" "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz" + "version" "4.5.4" + dependencies: + "accepts" "~1.3.4" + "base64id" "~2.0.0" + "debug" "~4.3.2" + "engine.io" "~6.2.1" + "socket.io-adapter" "~2.4.0" + "socket.io-parser" "~4.2.1" + +"source-map-js@^1.0.1", "source-map-js@^1.0.2": + "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + "version" "1.0.2" + +"styled-jsx@5.0.0": + "integrity" "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==" + "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz" + "version" "5.0.0" + +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" + +"supports-color@^7.1.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "has-flag" "^4.0.0" + +"supports-preserve-symlinks-flag@^1.0.0": + "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + "version" "1.0.0" + +"tailwindcss@^3.0.23": + "integrity" "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==" + "resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz" + "version" "3.0.23" + dependencies: + "arg" "^5.0.1" + "chalk" "^4.1.2" + "chokidar" "^3.5.3" + "color-name" "^1.1.4" + "cosmiconfig" "^7.0.1" + "detective" "^5.2.0" + "didyoumean" "^1.2.2" + "dlv" "^1.1.3" + "fast-glob" "^3.2.11" + "glob-parent" "^6.0.2" + "is-glob" "^4.0.3" + "normalize-path" "^3.0.0" + "object-hash" "^2.2.0" + "postcss" "^8.4.6" + "postcss-js" "^4.0.0" + "postcss-load-config" "^3.1.0" + "postcss-nested" "5.0.6" + "postcss-selector-parser" "^6.0.9" + "postcss-value-parser" "^4.2.0" + "quick-lru" "^5.1.1" + "resolve" "^1.22.0" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"typescript@^4.6.2": + "integrity" "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz" + "version" "4.6.2" + +"use-subscription@1.5.1": + "integrity" "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==" + "resolved" "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz" + "version" "1.5.1" + dependencies: + "object-assign" "^4.1.1" + +"util-deprecate@^1.0.2": + "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"vary@^1": + "integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + "version" "1.1.2" + +"ws@~8.2.3": + "integrity" "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" + "resolved" "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz" + "version" "8.2.3" + +"xmlhttprequest-ssl@~2.0.0": + "integrity" "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" + "resolved" "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" + "version" "2.0.0" + +"xtend@^4.0.2": + "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + "version" "4.0.2" + +"yaml@^1.10.0", "yaml@^1.10.2": + "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + "version" "1.10.2"