From eb85d99ac25cfb22408c67649a52151725afdeb1 Mon Sep 17 00:00:00 2001 From: vvandenb Date: Fri, 24 Mar 2023 13:16:51 +0100 Subject: [PATCH] push --- .env_sample | 30 + .gitattributes | 6 + .gitignore | 2 + Makefile | 23 + Makesudo | 23 + README.md | 85 + back.dockerfile | 5 + back/.eslintrc.js | 13 + back/.gitignore | 133 + back/nest-cli.json | 5 + back/package-lock.json | 11471 ++++++++++++++++ back/package.json | 94 + back/src/app.module.ts | 32 + back/src/auth/42-auth.guard.ts | 25 + back/src/auth/42.decorator.ts | 9 + back/src/auth/42.strategy.ts | 48 + back/src/auth/auth.controller.ts | 83 + back/src/auth/auth.module.ts | 54 + back/src/auth/auth.service.ts | 53 + back/src/auth/mails/confirm.hbs | 15 + back/src/auth/mails/confirmed.hbs | 12 + back/src/auth/session.serializer.ts | 20 + back/src/chat/chat.controller.ts | 249 + back/src/chat/chat.gateway.ts | 164 + back/src/chat/chat.module.ts | 25 + back/src/chat/chat.service.ts | 214 + back/src/chat/dto/connection.dto.ts | 17 + back/src/chat/dto/create-channel.dto.ts | 31 + back/src/chat/dto/create-message.dto.ts | 12 + back/src/chat/dto/kickUser.dto.ts | 12 + back/src/chat/dto/update-channel.dto.ts | 30 + back/src/chat/dto/updateUser.dto.ts | 25 + back/src/chat/entity/channel.entity.ts | 52 + back/src/chat/entity/connection.entity.ts | 13 + back/src/chat/entity/dm.entity.ts | 15 + back/src/chat/entity/message.entity.ts | 31 + back/src/chat/message.service.ts | 46 + back/src/main.ts | 49 + .../src/pong/dtos/GameCreationDtoValidated.ts | 38 + back/src/pong/dtos/GameInfo.ts | 13 + back/src/pong/dtos/GameUpdate.ts | 8 + back/src/pong/dtos/MapDtoValidated.ts | 23 + back/src/pong/dtos/MatchmakingDto.ts | 3 + back/src/pong/dtos/MatchmakingDtoValidated.ts | 7 + back/src/pong/dtos/PointDtoValidated.ts | 10 + back/src/pong/dtos/RectDtoValidated.ts | 14 + back/src/pong/dtos/StringDto.ts | 3 + back/src/pong/dtos/StringDtoValidated.ts | 7 + back/src/pong/dtos/UserDto.ts | 12 + back/src/pong/entity/result.entity.ts | 27 + back/src/pong/game/Ball.ts | 114 + back/src/pong/game/Game.ts | 197 + back/src/pong/game/Games.ts | 119 + back/src/pong/game/MatchmakingQueue.ts | 64 + back/src/pong/game/Paddle.ts | 32 + back/src/pong/game/Player.ts | 36 + back/src/pong/game/constants.ts | 22 + back/src/pong/game/utils.ts | 92 + back/src/pong/pong.controller.ts | 33 + back/src/pong/pong.gateway.ts | 239 + back/src/pong/pong.module.ts | 15 + back/src/pong/pong.service.ts | 88 + back/src/types.d.ts | 8 + back/src/users/dto/user.dto.ts | 37 + back/src/users/entity/user.entity.ts | 78 + back/src/users/users.controller.ts | 222 + back/src/users/users.module.ts | 14 + back/src/users/users.service.ts | 192 + back/tsconfig.build.json | 4 + back/tsconfig.json | 19 + docker-compose.yml | 37 + front.dockerfile | 5 + front/.gitignore | 132 + front/index.html | 18 + front/package-lock.json | 1596 +++ front/package.json | 28 + front/public/audio/edge_hit.wav | Bin 0 -> 8012 bytes front/public/audio/paddle_hit.wav | Bin 0 -> 3372 bytes front/public/audio/score.wav | Bin 0 -> 78448 bytes front/public/global.css | 77 + front/public/img/chat.png | Bin 0 -> 724 bytes front/public/img/close.png | Bin 0 -> 342 bytes front/public/img/pog.jpg | Bin 0 -> 9348 bytes front/public/img/pong.png | Bin 0 -> 4256 bytes front/public/img/send.png | Bin 0 -> 858 bytes front/public/vite.svg | 1 + front/src/App.svelte | 311 + front/src/Auth.ts | 47 + front/src/app.d.ts | 4 + front/src/components/Alert/Alert.svelte | 77 + front/src/components/Alert/content.ts | 30 + front/src/components/Channels.svelte | 394 + front/src/components/Chat.svelte | 485 + front/src/components/Friends.svelte | 190 + front/src/components/Leaderboard.svelte | 102 + front/src/components/MatchHistory.svelte | 167 + front/src/components/NavBar.svelte | 161 + front/src/components/Pong/Ball.ts | 16 + front/src/components/Pong/ColorPicker.svelte | 8 + front/src/components/Pong/Game.ts | 172 + .../src/components/Pong/GameComponent.svelte | 136 + front/src/components/Pong/GameCreation.svelte | 102 + front/src/components/Pong/Map.ts | 11 + .../components/Pong/MapCustomization.svelte | 118 + front/src/components/Pong/Matchmaking.svelte | 35 + front/src/components/Pong/Paddle.ts | 39 + front/src/components/Pong/Player.ts | 25 + front/src/components/Pong/Pong.svelte | 240 + front/src/components/Pong/constants.ts | 22 + .../components/Pong/dtos/GameCreationDto.ts | 8 + front/src/components/Pong/dtos/GameInfo.ts | 13 + front/src/components/Pong/dtos/GameUpdate.ts | 8 + .../components/Pong/dtos/MatchmakingDto.ts | 3 + front/src/components/Pong/dtos/StringDto.ts | 3 + front/src/components/Pong/utils.ts | 86 + front/src/components/Profile.svelte | 362 + front/src/components/dtos/connection.dto.ts | 6 + .../src/components/dtos/create-channel.dto.ts | 8 + .../src/components/dtos/create-message.dto.ts | 5 + front/src/components/dtos/kickUser.dto.ts | 5 + .../src/components/dtos/update-channel.dto.ts | 9 + front/src/components/dtos/updateUser.dto.ts | 15 + front/src/components/dtos/user.dto.ts | 8 + front/src/components/infiniteScroll.svelte | 39 + front/src/main.ts | 8 + front/src/vite-env.d.ts | 2 + front/svelte.config.js | 7 + front/tsconfig.json | 21 + front/tsconfig.node.json | 8 + front/vite.config.ts | 13 + 130 files changed, 20439 insertions(+) create mode 100644 .env_sample create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 Makesudo create mode 100644 README.md create mode 100644 back.dockerfile create mode 100644 back/.eslintrc.js create mode 100644 back/.gitignore create mode 100644 back/nest-cli.json create mode 100644 back/package-lock.json create mode 100644 back/package.json create mode 100644 back/src/app.module.ts create mode 100644 back/src/auth/42-auth.guard.ts create mode 100644 back/src/auth/42.decorator.ts create mode 100644 back/src/auth/42.strategy.ts create mode 100644 back/src/auth/auth.controller.ts create mode 100644 back/src/auth/auth.module.ts create mode 100644 back/src/auth/auth.service.ts create mode 100644 back/src/auth/mails/confirm.hbs create mode 100644 back/src/auth/mails/confirmed.hbs create mode 100644 back/src/auth/session.serializer.ts create mode 100644 back/src/chat/chat.controller.ts create mode 100644 back/src/chat/chat.gateway.ts create mode 100644 back/src/chat/chat.module.ts create mode 100644 back/src/chat/chat.service.ts create mode 100644 back/src/chat/dto/connection.dto.ts create mode 100644 back/src/chat/dto/create-channel.dto.ts create mode 100644 back/src/chat/dto/create-message.dto.ts create mode 100644 back/src/chat/dto/kickUser.dto.ts create mode 100644 back/src/chat/dto/update-channel.dto.ts create mode 100644 back/src/chat/dto/updateUser.dto.ts create mode 100644 back/src/chat/entity/channel.entity.ts create mode 100644 back/src/chat/entity/connection.entity.ts create mode 100644 back/src/chat/entity/dm.entity.ts create mode 100644 back/src/chat/entity/message.entity.ts create mode 100644 back/src/chat/message.service.ts create mode 100644 back/src/main.ts create mode 100644 back/src/pong/dtos/GameCreationDtoValidated.ts create mode 100644 back/src/pong/dtos/GameInfo.ts create mode 100644 back/src/pong/dtos/GameUpdate.ts create mode 100644 back/src/pong/dtos/MapDtoValidated.ts create mode 100644 back/src/pong/dtos/MatchmakingDto.ts create mode 100644 back/src/pong/dtos/MatchmakingDtoValidated.ts create mode 100644 back/src/pong/dtos/PointDtoValidated.ts create mode 100644 back/src/pong/dtos/RectDtoValidated.ts create mode 100644 back/src/pong/dtos/StringDto.ts create mode 100644 back/src/pong/dtos/StringDtoValidated.ts create mode 100644 back/src/pong/dtos/UserDto.ts create mode 100644 back/src/pong/entity/result.entity.ts create mode 100644 back/src/pong/game/Ball.ts create mode 100644 back/src/pong/game/Game.ts create mode 100644 back/src/pong/game/Games.ts create mode 100644 back/src/pong/game/MatchmakingQueue.ts create mode 100644 back/src/pong/game/Paddle.ts create mode 100644 back/src/pong/game/Player.ts create mode 100644 back/src/pong/game/constants.ts create mode 100644 back/src/pong/game/utils.ts create mode 100644 back/src/pong/pong.controller.ts create mode 100644 back/src/pong/pong.gateway.ts create mode 100644 back/src/pong/pong.module.ts create mode 100644 back/src/pong/pong.service.ts create mode 100644 back/src/types.d.ts create mode 100644 back/src/users/dto/user.dto.ts create mode 100644 back/src/users/entity/user.entity.ts create mode 100644 back/src/users/users.controller.ts create mode 100644 back/src/users/users.module.ts create mode 100644 back/src/users/users.service.ts create mode 100644 back/tsconfig.build.json create mode 100644 back/tsconfig.json create mode 100644 docker-compose.yml create mode 100644 front.dockerfile create mode 100644 front/.gitignore create mode 100644 front/index.html create mode 100644 front/package-lock.json create mode 100644 front/package.json create mode 100644 front/public/audio/edge_hit.wav create mode 100644 front/public/audio/paddle_hit.wav create mode 100644 front/public/audio/score.wav create mode 100644 front/public/global.css create mode 100644 front/public/img/chat.png create mode 100644 front/public/img/close.png create mode 100644 front/public/img/pog.jpg create mode 100644 front/public/img/pong.png create mode 100644 front/public/img/send.png create mode 100644 front/public/vite.svg create mode 100644 front/src/App.svelte create mode 100644 front/src/Auth.ts create mode 100644 front/src/app.d.ts create mode 100644 front/src/components/Alert/Alert.svelte create mode 100644 front/src/components/Alert/content.ts create mode 100644 front/src/components/Channels.svelte create mode 100644 front/src/components/Chat.svelte create mode 100644 front/src/components/Friends.svelte create mode 100644 front/src/components/Leaderboard.svelte create mode 100644 front/src/components/MatchHistory.svelte create mode 100644 front/src/components/NavBar.svelte create mode 100644 front/src/components/Pong/Ball.ts create mode 100644 front/src/components/Pong/ColorPicker.svelte create mode 100644 front/src/components/Pong/Game.ts create mode 100644 front/src/components/Pong/GameComponent.svelte create mode 100644 front/src/components/Pong/GameCreation.svelte create mode 100644 front/src/components/Pong/Map.ts create mode 100644 front/src/components/Pong/MapCustomization.svelte create mode 100644 front/src/components/Pong/Matchmaking.svelte create mode 100644 front/src/components/Pong/Paddle.ts create mode 100644 front/src/components/Pong/Player.ts create mode 100644 front/src/components/Pong/Pong.svelte create mode 100644 front/src/components/Pong/constants.ts create mode 100644 front/src/components/Pong/dtos/GameCreationDto.ts create mode 100644 front/src/components/Pong/dtos/GameInfo.ts create mode 100644 front/src/components/Pong/dtos/GameUpdate.ts create mode 100644 front/src/components/Pong/dtos/MatchmakingDto.ts create mode 100644 front/src/components/Pong/dtos/StringDto.ts create mode 100644 front/src/components/Pong/utils.ts create mode 100644 front/src/components/Profile.svelte create mode 100644 front/src/components/dtos/connection.dto.ts create mode 100644 front/src/components/dtos/create-channel.dto.ts create mode 100644 front/src/components/dtos/create-message.dto.ts create mode 100644 front/src/components/dtos/kickUser.dto.ts create mode 100644 front/src/components/dtos/update-channel.dto.ts create mode 100644 front/src/components/dtos/updateUser.dto.ts create mode 100644 front/src/components/dtos/user.dto.ts create mode 100644 front/src/components/infiniteScroll.svelte create mode 100644 front/src/main.ts create mode 100644 front/src/vite-env.d.ts create mode 100644 front/svelte.config.js create mode 100644 front/tsconfig.json create mode 100644 front/tsconfig.node.json create mode 100644 front/vite.config.ts diff --git a/.env_sample b/.env_sample new file mode 100644 index 0000000..3b5f5d3 --- /dev/null +++ b/.env_sample @@ -0,0 +1,30 @@ +### BACK ### +HOST=localhost +FRONT_PORT=80 +BACK_PORT=3001 +HASH_SALT=10 + +### FRONT ### +VITE_HOST=localhost +VITE_BACK_PORT=3001 + +### GAME ### +VITE_FRONT_FPS=144 + +### 2FA ### +MAIL_USER=vaganiwast@gmail.com +MAIL_PASSWORD= + +### AUTH ### +FT_OAUTH_CLIENT_ID= +FT_OAUTH_CLIENT_SECRET= +FT_OAUTH_CALLBACK_URL=http://localhost:3001/log/inReturn +JWT_SECRET= +JWT_EXPIRATION_TIME=900 + +### DB ### +POSTGRES_HOST=postgres +POSTGRES_PORT=5432 +POSTGRES_USER=postgres_usr +POSTGRES_PASSWORD=postgres_pw +POSTGRES_DB=transcendence diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..23fe8b9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +*.ts text=auto eol=lf +*.svelte text=auto eol=lf +*.yml text=auto eol=lf +*.json text=auto eol=lf +*.html text=auto eol=lf +*.xml text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26deeea --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +postgres diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c11c236 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +NAME = transcendence +USER = gavaniwast + +all: clean dev + +dev: + docker-compose up --build + +stop: + docker-compose down + +clean: stop + docker system prune -f + +fclean: stop + rm -rf postgres + rm -rf back/volumes/avatars + rm -rf */node_modules + docker system prune -af --volumes + +re: fclean dev + +.PHONY: all dev stop clean fclean re diff --git a/Makesudo b/Makesudo new file mode 100644 index 0000000..64d041a --- /dev/null +++ b/Makesudo @@ -0,0 +1,23 @@ +NAME = transcendence +USER = gavaniwast + +all: clean dev + +dev: + sudo docker-compose up --build + +stop: + sudo docker-compose down + +clean: stop + sudo docker system prune -f + +fclean: stop + sudo rm -rf postgres + sudo rm -rf back/avatars + sudo rm -rf */node_modules + sudo docker system prune -af --volumes + +re: fclean dev + +.PHONY: all dev stop clean fclean re diff --git a/README.md b/README.md new file mode 100644 index 0000000..92b78b5 --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# Transcendence +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)[![js-standard-style](https://cdn.rawgit.com/standard/standard/master/badge.svg)](http://standardjs.com) + + +## Instructions: + +If you not use rootless docker, either rename Makesudo as Makefile or call `make` with `-f Makesudo`. +### Rules: +- prod: build and lauch client and server on builded resources. +- dev: launch client and server without build using nest and vite. +- check: format and lint back and check front. +- debug: launch back with debug flags. + +### Setting: +rename .env_sample to .env and customize it to your needs and credentials. + +## Back endpoints: +|Method|endpoint|description|account securised?| +|:---:|:---:|:---:|:---:| +|GET |/log/in |the login using 42 api.|☑| +|GET |/log/inReturn |the 42 api callback.|☑| +|GET |/log/profile |get connected user 42's datas.|☑| +|GET |/log/out |log out user.|☑| +|GET |/all |return all users publics datas.|☒| +|GET |/online |return all online users's public datas.|☒| +|GET |/friends |return users which are friends.|☑| +|GET |/invits |return users which invited user to be friend.|☑| +|GET |/leader |return the global leaderboard|☑| +|GET |/leader/:id |return the user(id) place in leaderboard|☑| +|GET |/history |return the matchs results sorted by date|☑| +|GET |/history/:id |return the last user(id)'s results sorted by date|☑| +|POST|/avatar |set a user() avatar with multipart post upload.|☑| +|GET |/avatar |return the user() avatar|☒| +|GET |/user/:name |return the user(name)|☒| +|POST|/invit/:id |user() invit user(id) as friend.|☑| +|GET |/avatar/:id |return the user(id)'s avatar|☒| +|GET |/:id |return user(id) public datas|☒| +|POST|/:id |update/create user(id)|☑| +|GET |/ |return user()' public datas|☑| +|POST|/ |update/create user()|☑| + +## Dependencies: + +### Front: +- [@svelte/vite-plugin-svelte](https://www.npmjs.com/package/@sveltejs/vite-plugin-svelte) +- [@tsconfig/svelte](https://www.npmjs.com/package/@tsconfig/svelte) +- [svelte](https://www.npmjs.com/package/svelte) +- [svelte-check](https://www.npmjs.com/package/svelte-check) +- [tslib](https://www.npmjs.com/package/tslib) +- [typescript](https://www.npmjs.com/package/typescript) +- [vite](https://www.npmjs.com/package/vite) + +### Back: +- [@nestjs/cli](https://www.npmjs.com/package/@nestjs/cli) +- [@nestjs/common](https://www.npmjs.com/package/@nestjs/common) +- [@nestjs/core](https://www.npmjs.com/package/@nestjs/core) +- [@nestjs/platform-express](https://www.npmjs.com/package/@nestjs/platform-express) +- [@nestjs/platform-ws](https://www.npmjs.com/package/@nestjs/platform-ws) +- [@nestjs/schematics](https://www.npmjs.com/package/@nestjs/schematics) +- [@nestjs/testing](https://www.npmjs.com/package/@nestjs/testing) +- [@nestjs/websockets](https://www.npmjs.com/package/@nestjs/websockets) +- [@types/express](https://www.npmjs.com/package/@types/express) +- [@types/jest](https://www.npmjs.com/package/@types/jest) +- [@types/node](https://www.npmjs.com/package/@types/node) +- [@types/supertest](https://www.npmjs.com/package/@types/supertest) +- [@typescript-eslint/eslint-plugin](https://www.npmjs.com/package/@typescript-eslint/eslint-plugin) +- [@typescript-eslint/parser](https://www.npmjs.com/package/@typescript-eslint/parser) +- [eslint](https://www.npmjs.com/package/eslint) +- [eslint-config-prettier](https://www.npmjs.com/package/eslint-config-prettier) +- [eslint-plugin-prettier](https://www.npmjs.com/package/eslint-plugin-prettier) +- [jest](https://www.npmjs.com/package/jest) +- [prettier](https://www.npmjs.com/package/prettier) +- [reflect-metadata](https://www.npmjs.com/package/reflect-metadata) +- [rimraf](https://www.npmjs.com/package/rimraf) +- [rxjs](https://www.npmjs.com/package/rxjs) +- [source-map-support](https://www.npmjs.com/package/source-map-support) +- [supertest](https://www.npmjs.com/package/supertest) +- [ts-jest](https://www.npmjs.com/package/ts-jest) +- [ts-loader](https://www.npmjs.com/package/ts-loader) +- [ts-node](https://www.npmjs.com/package/ts-node) +- [tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths) +- [typescript](https://www.npmjs.com/package/typescript) +- [ws](https://www.npmjs.com/package/ws) + + diff --git a/back.dockerfile b/back.dockerfile new file mode 100644 index 0000000..2040078 --- /dev/null +++ b/back.dockerfile @@ -0,0 +1,5 @@ +FROM alpine:3.15 + +RUN apk update && apk upgrade && apk add npm && npm install -g @nestjs/cli +WORKDIR /var/www/html +ENTRYPOINT npm install && npm run dev diff --git a/back/.eslintrc.js b/back/.eslintrc.js new file mode 100644 index 0000000..68e0778 --- /dev/null +++ b/back/.eslintrc.js @@ -0,0 +1,13 @@ +module.exports = { + env: { + browser: true, + es2021: true + }, + extends: 'standard-with-typescript', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json'], + tsconfigRootDir: __dirname + } +} diff --git a/back/.gitignore b/back/.gitignore new file mode 100644 index 0000000..324572d --- /dev/null +++ b/back/.gitignore @@ -0,0 +1,133 @@ +avatars/ +.env + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* diff --git a/back/nest-cli.json b/back/nest-cli.json new file mode 100644 index 0000000..2566481 --- /dev/null +++ b/back/nest-cli.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/back/package-lock.json b/back/package-lock.json new file mode 100644 index 0000000..e2b459e --- /dev/null +++ b/back/package-lock.json @@ -0,0 +1,11471 @@ +{ + "name": "pong_server", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pong_server", + "version": "0.0.1", + "license": "UNLICENSED", + "dependencies": { + "@nestjs-modules/mailer": "^1.8.1", + "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.1", + "@nestjs/core": "^9.0.0", + "@nestjs/jwt": "^10.0.2", + "@nestjs/mapped-types": "^1.2.2", + "@nestjs/passport": "^9.0.3", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/platform-socket.io": "^9.3.9", + "@nestjs/schedule": "^2.2.0", + "@nestjs/swagger": "^6.2.1", + "@nestjs/testing": "^9.0.0", + "@nestjs/typeorm": "^9.0.1", + "@nestjs/websockets": "^9.2.0", + "@types/bcrypt": "^5.0.0", + "@types/cookie-parser": "^1.4.3", + "@types/express": "^4.17.13", + "@types/express-session": "^1.17.6", + "@types/multer": "^1.4.7", + "@types/node": "^16.18.14", + "@types/passport": "^1.0.12", + "bcrypt": "^5.1.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "cookie-parser": "^1.4.6", + "express": "^4.18.2", + "express-session": "^1.17.3", + "multer": "^1.4.5-lts.1", + "nestjs-paginate": "^4.13.0", + "nodemailer": "^6.9.1", + "passport": "^0.6.0", + "passport-42": "^1.2.6", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.8.0", + "socket.io": "^4.6.1", + "source-map-support": "^0.5.21", + "typeorm": "^0.3.12" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.34.0", + "eslint-config-standard-with-typescript": "^34.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-promise": "^6.1.1", + "jest": "28.1.3", + "prettier": "^2.3.2", + "ts-jest": "28.0.8", + "ts-node": "^10.0.0", + "typescript": "^4.9.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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/@babel/parser": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", + "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.2", + "@babel/types": "^7.21.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", + "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "peer": true, + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==", + "peer": true + }, + "node_modules/@fastify/error": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.2.0.tgz", + "integrity": "sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==", + "peer": true + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.2.0.tgz", + "integrity": "sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==", + "peer": true, + "dependencies": { + "fast-json-stringify": "^5.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/core": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", + "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/reporters": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.1.3", + "jest-config": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-resolve-dependencies": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "jest-watcher": "^28.1.3", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "dependencies": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", + "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jonkemp/package-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz", + "integrity": "sha512-bIcKnH5YmtTYr7S6J3J86dn/rFiklwRpOqbTOQ9C0WMmR9FKHVb3bxs2UYfqEmNb93O4nbA97sb6rtz33i9SyA==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", + "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nestjs-modules/mailer": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@nestjs-modules/mailer/-/mailer-1.8.1.tgz", + "integrity": "sha512-rNlKzNB+Vr/aRDVcTibj2JCJQcTSE59EBQIpCwh/FkKg0Be1xoF3dQDZ4dmc9X1j396fkIBI5aQ5XAtJNPdxpw==", + "dependencies": { + "glob": "8.0.3", + "inline-css": "4.0.1", + "mjml": "^4.12.0", + "preview-email": "3.0.5" + }, + "optionalDependencies": { + "@types/ejs": "^3.0.3", + "@types/pug": "2.0.6", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "pug": "^3.0.1" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.9 || ^8.0.0 || ^9.0.0", + "@nestjs/core": "^7.0.9 || ^8.0.0 || ^9.0.0", + "@types/ejs": "^3.0.3", + "@types/pug": "2.0.6", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "nodemailer": "^6.4.6", + "pug": "^3.0.1" + } + }, + "node_modules/@nestjs/common": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.3.9.tgz", + "integrity": "sha512-GshTD9Xz+wD2em6NyzU4NXw5IXMUmapgDgD+iuj6XL0258hvDwODmNk37mBBnZvTZlqER+krvIUKnS34etqF/A==", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.5.0", + "uid": "2.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "cache-manager": "<=5", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "cache-manager": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/config": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.1.tgz", + "integrity": "sha512-Ckzel0NZ9CWhNsLfE1hxfDuxJuEbhQvGxSlmZ1/X8awjRmAA/g3kT6M1+MO1SHj1wMtPyUfd9WpwkiqFbiwQgA==", + "dependencies": { + "dotenv": "16.0.3", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^6.0.0 || ^7.2.0" + } + }, + "node_modules/@nestjs/core": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.9.tgz", + "integrity": "sha512-9g1A1G9eirLXEpH21rc6dKb08zHc2+adhCRz8NW39hbejcsxxD72FApJzt4QBQAKvu862ixt/tdpStnFT7lOSw==", + "hasInstallScript": true, + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.2.0", + "tslib": "2.5.0", + "uid": "2.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/microservices": "^9.0.0", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/websockets": "^9.0.0", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/jwt": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.0.2.tgz", + "integrity": "sha512-MLxjCSbO7C9fN2hst5kpIhnJAgglJmrKppXAXqElB8A9ip3ZuCowMDjjmNWWJyfOzE98NV0E0iEQGE2StMUC+Q==", + "dependencies": { + "@types/jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.2.tgz", + "integrity": "sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==", + "peerDependencies": { + "@nestjs/common": "^7.0.8 || ^8.0.0 || ^9.0.0", + "class-transformer": "^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0", + "class-validator": "^0.11.1 || ^0.12.0 || ^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/passport": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.3.tgz", + "integrity": "sha512-HplSJaimEAz1IOZEu+pdJHHJhQyBOPAYWXYHfAPQvRqWtw4FJF1VXl1Qtk9dcXQX1eKytDtH+qBzNQc19GWNEg==", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "passport": "^0.4.0 || ^0.5.0 || ^0.6.0" + } + }, + "node_modules/@nestjs/platform-express": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.3.9.tgz", + "integrity": "sha512-f8ja2sYuDGj2QSMmjg05n3WF19wJG5yTiYxRi64nsu5GKL0qLM1LzxNemehkni/knExlvF2bDpbKKpna9nC1JA==", + "dependencies": { + "body-parser": "1.20.1", + "cors": "2.8.5", + "express": "4.18.2", + "multer": "1.4.4-lts.1", + "tslib": "2.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/multer": { + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@nestjs/platform-socket.io": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-9.3.9.tgz", + "integrity": "sha512-fWlET24udsVjIolSjrIIj8vGqixnTXrQnrEKF1nqFpE8BW9O8Eji00Ih/A2z0MU/8fTHEiokyBIDAX5IKvhKzQ==", + "dependencies": { + "socket.io": "4.6.0", + "tslib": "2.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/websockets": "^9.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/platform-socket.io/node_modules/socket.io": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz", + "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nestjs/schedule": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-2.2.0.tgz", + "integrity": "sha512-wrDnUONTxBkD6lTWh9ecYk/kvJTbA3PylotjBoRsECmcS1SNvgInFXuL38UnHiFnXM3CHSFnzRLB259Bc1mOdQ==", + "dependencies": { + "cron": "2.2.0", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0", + "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.12" + } + }, + "node_modules/@nestjs/swagger": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-6.2.1.tgz", + "integrity": "sha512-9M2vkfJHIzLqDZwvM5TEZO0MxRCvIb0xVy0LsmWwxH1lrb0z/4MhU+r2CWDhBtTccVJrKxVPiU2s3T3b9uUJbg==", + "dependencies": { + "@nestjs/mapped-types": "1.2.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "4.15.5" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0", + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.9.tgz", + "integrity": "sha512-+mPvSVvSC2SAkYgZZv1mOI2xsdGc1pmq7/sem7iin/JDoFtlvoGSK+pfZHD3IV3EpYtq1v/8/5gi+UFH9yZnDg==", + "dependencies": { + "tslib": "2.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "@nestjs/microservices": "^9.0.0", + "@nestjs/platform-express": "^9.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/typeorm": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-9.0.1.tgz", + "integrity": "sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==", + "dependencies": { + "uuid": "8.3.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, + "node_modules/@nestjs/typeorm/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@nestjs/websockets": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-9.3.9.tgz", + "integrity": "sha512-HbusWv+6rKtOLnppLZDCq5KfGMIVuItp1RPBzb/ObdMvDR5/TfMThSTtMVfTi8xnlBb7N36poeUX88oyJXQ5Iw==", + "dependencies": { + "iterare": "1.2.1", + "object-hash": "3.0.0", + "tslib": "2.5.0" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0", + "@nestjs/core": "^9.0.0", + "@nestjs/platform-socket.io": "^9.0.0", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/platform-socket.io": { + "optional": true + } + } + }, + "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/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.10.0.tgz", + "integrity": "sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.10.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "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/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "devOptional": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "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/cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", + "dependencies": { + "@types/express": "*" + } + }, + "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/ejs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz", + "integrity": "sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==", + "optional": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/express-session": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.6.tgz", + "integrity": "sha512-L6sB04HVA4HEZo1hDL65JXdZdBJtzZnCiw/P7MnO4w6746tJCNtXlHtzEASyI9ccn9zyOw6IbqQuhVa03VpO4w==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "16.18.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.14.tgz", + "integrity": "sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw==" + }, + "node_modules/@types/passport": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", + "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "optional": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/validator": { + "version": "13.7.13", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.13.tgz", + "integrity": "sha512-EMfHccxNKXaSxTK6DN0En9WsXa7uR4w3LQtx31f6Z2JjG5hJQeVX5zUYMZoatjZgnoQmRcT94WnNWwi0BzQW6Q==" + }, + "node_modules/@types/yargs": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", + "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", + "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/type-utils": "5.54.1", + "@typescript-eslint/utils": "5.54.1", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", + "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", + "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", + "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/utils": "5.54.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", + "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", + "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", + "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", + "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.54.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "peer": 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": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "peer": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/avvio": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", + "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "peer": true, + "dependencies": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, + "node_modules/babel-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", + "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", + "dev": true, + "dependencies": { + "@jest/transform": "^28.1.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/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/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001464", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz", + "integrity": "sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/class-validator": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.0.tgz", + "integrity": "sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==", + "dependencies": { + "@types/validator": "^13.7.10", + "libphonenumber-js": "^1.10.14", + "validator": "^13.7.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/cli-highlight/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/cli-highlight/node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "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/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/cron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.2.0.tgz", + "integrity": "sha512-GPiI3OgMv83XRtEUc2gUdaLvJhO3XbLN288layOBkDTupg0RK5IECNGpkykIMHg+muVR2bxt29b0xvCAcBrjYQ==", + "dependencies": { + "luxon": "^3.2.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-rules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-rules/-/css-rules-1.1.0.tgz", + "integrity": "sha512-7L6krLIRwAEVCaVKyCEL6PQjQXUmf8DM9bWYKutlZd0DqOe0SiKIGQOkFb59AjDBb+3If7SDp3X8UlzDAgYSow==", + "dependencies": { + "cssom": "^0.5.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "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/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "optional": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.328", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz", + "integrity": "sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-japanese": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.0.0.tgz", + "integrity": "sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==", + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "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.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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/es-abstract": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "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" + } + ], + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-with-typescript": { + "version": "34.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-34.0.0.tgz", + "integrity": "sha512-zhCsI4/A0rJ1ma8sf3RLXYc0gc7yPmdTWRVXMh9dtqeUx3yBQyALH0wosHhk1uQ9QyItynLdNOtcHKNw8G7lQw==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint-config-standard": "17.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0", + "typescript": "*" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", + "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/espree": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/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/express-session/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/extract-css": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-3.0.1.tgz", + "integrity": "sha512-mLNcMxYX7JVPcGUw7pgjczasLnvimYGlXFWuSx2YQ421sZDlBq4Dh0UzsSeXutf80Z0P2BtV5ZZt0FbaWTOxsQ==", + "dependencies": { + "batch": "^0.6.1", + "href-content": "^2.0.2", + "list-stylesheets": "^2.0.1", + "style-data": "^2.0.1" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.0.0.tgz", + "integrity": "sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==", + "peer": true + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "peer": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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/fast-glob/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/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-json-stringify": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.6.2.tgz", + "integrity": "sha512-F6xkRrXvtGbAiDSEI5Rk7qk2P63Y9kc8bO6Dnsd3Rt6sBNr2QxNFWs0JbKftgiyOfGxnJaRoHe4SizCTqeAyrA==", + "peer": true, + "dependencies": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-querystring": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.1.tgz", + "integrity": "sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q==", + "peer": true, + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-uri": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", + "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==", + "peer": true + }, + "node_modules/fastify": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.14.1.tgz", + "integrity": "sha512-yjrDeXe77j9gRlSV2UJry8mcFWbD0NQ5JYjnPi4tkFjHZVaG3/BD5wxOmRzGnHPC0YvaBJ0XWrIfFPl2IHRa1w==", + "peer": true, + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.0.0", + "@fastify/fast-json-stringify-compiler": "^4.1.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.2.0", + "fast-content-type-parse": "^1.0.0", + "find-my-way": "^7.3.0", + "light-my-request": "^5.6.1", + "pino": "^8.5.0", + "process-warning": "^2.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.5.0", + "semver": "^7.3.7", + "tiny-lru": "^10.0.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "optional": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-my-way": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.6.0.tgz", + "integrity": "sha512-H7berWdHJ+5CNVr4ilLWPai4ml7Y2qAsxjw3pfeBxPigZmaDTzF0wjJLj90xRCmGcWYcyt050yN+34OZDJm1eQ==", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-util": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/flat-util/-/flat-util-1.1.9.tgz", + "integrity": "sha512-BOTMw/6rbbxVjv5JQvwgGMc2/6wWGd2VeyTvnzvvE49VRjS0tTxLbry/QVP1yPw8SaAOBYsnixmzruXoqjdUHA==" + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "optional": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/href-content": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/href-content/-/href-content-2.0.2.tgz", + "integrity": "sha512-f/e40VYI+KciPGfFzfdw1wu8dptpUA9rYQJNbpYVRI217lyuo7nBNO7BjYfTiQMhU/AthfvPDMvj46uAgzUccQ==", + "dependencies": { + "remote-content": "^3.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dependencies": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-to-text": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.4.tgz", + "integrity": "sha512-ckrQ5N2yZS7qSgKxUbqrBZ02NxD5cSy7KuYjCNIf+HWbdzY3fbjYjQsoRIl6TiaZ4+XWOi0ggFP8/pmgCK/o+A==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.10.0", + "deepmerge": "^4.3.0", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.1", + "selderee": "^0.10.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-css": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/inline-css/-/inline-css-4.0.1.tgz", + "integrity": "sha512-gzumhrp0waBLF5TtwQcm5bviA9ZNURXeNOs2xVSTsX60FWPFlrPJol4HI8yrozZ6V5udWKUT3LS2tMUDMMdi1Q==", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "css-rules": "^1.1.0", + "extract-css": "^3.0.0", + "flat-util": "^1.1.8", + "pick-util": "^1.1.4", + "slick": "^1.12.2", + "specificity": "^0.4.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "optional": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", + "import-local": "^3.0.2", + "jest-cli": "^28.1.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-cli": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", + "dev": true, + "dependencies": { + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-beautify": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", + "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.0.3", + "nopt": "^6.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-beautify/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, + "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==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/juice": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-7.0.0.tgz", + "integrity": "sha512-AjKQX31KKN+uJs+zaf+GW8mBO/f/0NqSh2moTMyvwBY+4/lXIYTU8D8I2h6BAV3Xnz6GGsbalUyFqbYMe+Vh+Q==", + "dependencies": { + "cheerio": "^1.0.0-rc.3", + "commander": "^5.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^5.0.0" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libbase64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.2.1.tgz", + "integrity": "sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==" + }, + "node_modules/libmime": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.2.1.tgz", + "integrity": "sha512-A0z9O4+5q+ZTj7QwNe/Juy1KARNb4WaviO4mYeFC4b8dBT2EEqK2pkM+GC8MVnkOjqhl5nYQxRgnPYRRTNmuSQ==", + "dependencies": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "2.0.1" + } + }, + "node_modules/libmime/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.10.21", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.21.tgz", + "integrity": "sha512-/udZhx49av2r2gZR/+xXSrwcR8smX/sDNrVpOFrvW+CA26TfYTVZfwb3MIDvmwAYMLs7pXuJjZX0VxxGpqPhsA==" + }, + "node_modules/libqp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.0.1.tgz", + "integrity": "sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==" + }, + "node_modules/light-my-request": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.9.1.tgz", + "integrity": "sha512-UT7pUk8jNCR1wR7w3iWfIjx32DiB2f3hFdQSOwy3/EPQ3n3VocyipUxcyRZR0ahoev+fky69uA+GejPa9KuHKg==", + "peer": true, + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/light-my-request/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/list-stylesheets": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/list-stylesheets/-/list-stylesheets-2.0.1.tgz", + "integrity": "sha512-UUEFowqvgRKT1+OJ59Ga5gTfVOP3hkbFo7DwNIZcMuXzJRWndYMHyDYbuqKe6lrw8KCY7c/GN5mEoLx0c54HAw==", + "dependencies": { + "cheerio": "1.0.0-rc.12", + "pick-util": "^1.1.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mailparser": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.6.4.tgz", + "integrity": "sha512-4bDgbLdlcBKX8jtVskfn/G93nZo3lf7pyuLbAQ031SHQLihEqxtRwHrb9SXMTqiTkEGlOdpDrZE5uH18O+2A+A==", + "dependencies": { + "encoding-japanese": "2.0.0", + "he": "1.2.0", + "html-to-text": "9.0.4", + "iconv-lite": "0.6.3", + "libmime": "5.2.1", + "linkify-it": "4.0.1", + "mailsplit": "5.4.0", + "nodemailer": "6.9.1", + "tlds": "1.236.0" + } + }, + "node_modules/mailparser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailsplit": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.4.0.tgz", + "integrity": "sha512-wnYxX5D5qymGIPYLwnp6h8n1+6P6vz/MJn5AzGjZ8pwICWssL+CCQjWBIToOVHASmATot4ktvlLo6CyLfOXWYA==", + "dependencies": { + "libbase64": "1.2.1", + "libmime": "5.2.0", + "libqp": "2.0.1" + } + }, + "node_modules/mailsplit/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mailsplit/node_modules/libmime": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.2.0.tgz", + "integrity": "sha512-X2U5Wx0YmK0rXFbk67ASMeqYIkZ6E5vY7pNWRKtnNzqjvdYYG8xtPDpCnuUEnPU9vlgNev+JoSrcaKSUaNvfsw==", + "dependencies": { + "encoding-japanese": "2.0.0", + "iconv-lite": "0.6.3", + "libbase64": "1.2.1", + "libqp": "2.0.1" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mediaquery-text": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mediaquery-text/-/mediaquery-text-1.2.0.tgz", + "integrity": "sha512-cJyRqgYQi+hsYhRkyd5le0s4LsEPvOB7r+6X3jdEELNqVlM9mRIgyUPg9BzF+PuTqQH1ZekgIjYVOeWSXWq35Q==", + "dependencies": { + "cssom": "^0.5.0" + } + }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "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/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mjml": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml/-/mjml-4.13.0.tgz", + "integrity": "sha512-OnFKESouLshz8DPFSb6M/dE8GkhiJnoy6LAam5TiLA1anAj24yQ2ZH388LtQoEkvTisqwiTmc9ejDh5ctnFaJQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "mjml-cli": "4.13.0", + "mjml-core": "4.13.0", + "mjml-migrate": "4.13.0", + "mjml-preset-core": "4.13.0", + "mjml-validator": "4.13.0" + }, + "bin": { + "mjml": "bin/mjml" + } + }, + "node_modules/mjml-accordion": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-accordion/-/mjml-accordion-4.13.0.tgz", + "integrity": "sha512-E3yihZW5Oq2p+sWOcr8kWeRTROmiTYOGxB4IOxW/jTycdY07N3FX3e6vuh7Fv3rryHEUaydUQYto3ICVyctI7w==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-body": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-body/-/mjml-body-4.13.0.tgz", + "integrity": "sha512-S4HgwAuO9dEsyX9sr6WBf9/xr+H2ASVaLn22aurJm1S2Lvc1wifLPYBQgFmNdCjaesTCNtOMUDpG+Rbnavyaqg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-button": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-button/-/mjml-button-4.13.0.tgz", + "integrity": "sha512-3y8IAHCCxh7ESHh1aOOqobZKUgyNxOKAGQ9TlJoyaLpsKUFzkN8nmrD0KXF0ADSuzvhMZ1CdRIJuZ5mjv2TwWQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-carousel": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-carousel/-/mjml-carousel-4.13.0.tgz", + "integrity": "sha512-ORSY5bEYlMlrWSIKI/lN0Tz3uGltWAjG8DQl2Yr3pwjwOaIzGE+kozrDf+T9xItfiIIbvKajef1dg7B7XgP0zg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-cli": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-cli/-/mjml-cli-4.13.0.tgz", + "integrity": "sha512-kAZxpH0QqlTF/CcLzELgKw1ljKRxrmWJ310CJQhbPAxHvwQ/nIb+q82U+zRJAelRPPKjnOb+hSrMRqTgk9rH3w==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "chokidar": "^3.0.0", + "glob": "^7.1.1", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-migrate": "4.13.0", + "mjml-parser-xml": "4.13.0", + "mjml-validator": "4.13.0", + "yargs": "^16.1.0" + }, + "bin": { + "mjml-cli": "bin/mjml" + } + }, + "node_modules/mjml-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mjml-cli/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mjml-cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-column": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-column/-/mjml-column-4.13.0.tgz", + "integrity": "sha512-O8FrWKK/bCy9XpKxrKRYWNdgWNaVd4TK4RqMeVI/I70IbnYnc1uf15jnsPMxCBSbT+NyXyk8k7fn099797uwpw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-core/-/mjml-core-4.13.0.tgz", + "integrity": "sha512-kU5AoVTlZaXR/EDi3ix66xpzUe+kScYus71lBH/wo/B+LZW70GHE1AYWtsog5oJp1MuTHpMFTNuBD/wePeEgWg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "cheerio": "1.0.0-rc.10", + "detect-node": "2.0.4", + "html-minifier": "^4.0.0", + "js-beautify": "^1.6.14", + "juice": "^7.0.0", + "lodash": "^4.17.21", + "mjml-migrate": "4.13.0", + "mjml-parser-xml": "4.13.0", + "mjml-validator": "4.13.0" + } + }, + "node_modules/mjml-core/node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/mjml-core/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/mjml-core/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mjml-core/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/mjml-core/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/mjml-core/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/mjml-divider": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-divider/-/mjml-divider-4.13.0.tgz", + "integrity": "sha512-ooPCwfmxEC+wJduqObYezMp7W5UCHjL9Y1LPB5FGna2FrOejgfd6Ix3ij8Wrmycmlol7E2N4D7c5NDH5DbRCJg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-group": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-group/-/mjml-group-4.13.0.tgz", + "integrity": "sha512-U7E8m8aaoAE/dMqjqXPjjrKcwO36B4cquAy9ASldECrIZJBcpFYO6eYf5yLXrNCUM2P0id8pgVjrUq23s00L7Q==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head/-/mjml-head-4.13.0.tgz", + "integrity": "sha512-sL2qQuoVALXBCiemu4DPo9geDr8DuUdXVJxm+4nd6k5jpLCfSDmFlNhgSsLPzsYn7VEac3/sxsjLtomQ+6/BHg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-attributes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-attributes/-/mjml-head-attributes-4.13.0.tgz", + "integrity": "sha512-haggCafno+0lQylxJStkINCVCPMwfTpwE6yjCHeGOpQl/TkoNmjNkDr7DEEbNTZbt4Ekg070lQFn7clDy38EoA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-breakpoint": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-breakpoint/-/mjml-head-breakpoint-4.13.0.tgz", + "integrity": "sha512-D2iPDeUKQK1+rYSNa2HGOvgfPxZhNyndTG0iBEb/FxdGge2hbeDCZEN0mwDYE3wWB+qSBqlCuMI+Vr4pEjZbKg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-font": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-font/-/mjml-head-font-4.13.0.tgz", + "integrity": "sha512-mYn8aWnbrEap5vX2b4662hkUv6WifcYzYn++Yi6OHrJQi55LpzcU+myAGpfQEXXrpU8vGwExMTFKsJq5n2Kaow==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-html-attributes": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-html-attributes/-/mjml-head-html-attributes-4.13.0.tgz", + "integrity": "sha512-m30Oro297+18Zou/1qYjagtmCOWtYXeoS38OABQ5zOSzMItE3TcZI9JNcOueIIWIyFCETe8StrTAKcQ2GHwsDw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-preview": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-preview/-/mjml-head-preview-4.13.0.tgz", + "integrity": "sha512-v0K/NocjFCbaoF/0IMVNmiqov91HxqT07vNTEl0Bt9lKFrTKVC01m1S4K7AB78T/bEeJ/HwmNjr1+TMtVNGGow==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-style": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-style/-/mjml-head-style-4.13.0.tgz", + "integrity": "sha512-tBa33GL9Atn5bAM2UwE+uxv4rI29WgX/e5lXX+5GWlsb4thmiN6rxpFTNqBqWbBNRbZk4UEZF78M7Da8xC1ZGQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-head-title": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-head-title/-/mjml-head-title-4.13.0.tgz", + "integrity": "sha512-Mq0bjuZXJlwxfVcjuYihQcigZSDTKeQaG3nORR1D0jsOH2BXU4XgUK1UOcTXn2qCBIfRoIMq7rfzYs+L0CRhdw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-hero": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-hero/-/mjml-hero-4.13.0.tgz", + "integrity": "sha512-aWEOScdrhyjwdKBWG4XQaElRHP8LU5PtktkpMeBXa4yxrxNs25qRnDqMNkjSrnnmFKWZmQ166tfboY6RBNf0UA==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-image": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-image/-/mjml-image-4.13.0.tgz", + "integrity": "sha512-agMmm2wRZTIrKwrUnYFlnAbtrKYSP0R2en+Vf92HPspAwmaw3/AeOW/QxmSiMhfGf+xsEJyzVvR/nd33jbT3sg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-migrate": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-migrate/-/mjml-migrate-4.13.0.tgz", + "integrity": "sha512-I1euHiAyNpaz+B5vH+Z4T+hg/YtI5p3PqQ3/zTLv8gi24V6BILjTaftWhH5+3R/gQkQhH0NUaWNnRmds+Mq5DQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "js-beautify": "^1.6.14", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-parser-xml": "4.13.0", + "yargs": "^16.1.0" + }, + "bin": { + "migrate": "lib/cli.js" + } + }, + "node_modules/mjml-migrate/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mjml-migrate/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-migrate/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/mjml-navbar": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-navbar/-/mjml-navbar-4.13.0.tgz", + "integrity": "sha512-0Oqyyk+OdtXfsjswRb/7Ql1UOjN4MbqFPKoyltJqtj+11MRpF5+Wjd74Dj9H7l81GFwkIB9OaP+ZMiD+TPECgg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-parser-xml": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-parser-xml/-/mjml-parser-xml-4.13.0.tgz", + "integrity": "sha512-phljtI8DaW++q0aybR/Ykv9zCyP/jCFypxVNo26r2IQo//VYXyc7JuLZZT8N/LAI8lZcwbTVxQPBzJTmZ5IfwQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "detect-node": "2.0.4", + "htmlparser2": "^4.1.0", + "lodash": "^4.17.15" + } + }, + "node_modules/mjml-parser-xml/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mjml-parser-xml/node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/mjml-preset-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-preset-core/-/mjml-preset-core-4.13.0.tgz", + "integrity": "sha512-gxzYaKkvUrHuzT1oqjEPSDtdmgEnN99Hf5f1r2CR5aMOB1x66EA3T8ATvF1o7qrBTVV4KMVlQem3IubMSYJZRw==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "mjml-accordion": "4.13.0", + "mjml-body": "4.13.0", + "mjml-button": "4.13.0", + "mjml-carousel": "4.13.0", + "mjml-column": "4.13.0", + "mjml-divider": "4.13.0", + "mjml-group": "4.13.0", + "mjml-head": "4.13.0", + "mjml-head-attributes": "4.13.0", + "mjml-head-breakpoint": "4.13.0", + "mjml-head-font": "4.13.0", + "mjml-head-html-attributes": "4.13.0", + "mjml-head-preview": "4.13.0", + "mjml-head-style": "4.13.0", + "mjml-head-title": "4.13.0", + "mjml-hero": "4.13.0", + "mjml-image": "4.13.0", + "mjml-navbar": "4.13.0", + "mjml-raw": "4.13.0", + "mjml-section": "4.13.0", + "mjml-social": "4.13.0", + "mjml-spacer": "4.13.0", + "mjml-table": "4.13.0", + "mjml-text": "4.13.0", + "mjml-wrapper": "4.13.0" + } + }, + "node_modules/mjml-raw": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-raw/-/mjml-raw-4.13.0.tgz", + "integrity": "sha512-JbBYxwX1a/zbqnCrlDCRNqov2xqUrMCaEdTHfqE2athj479aQXvLKFM20LilTMaClp/dR0yfvFLfFVrC5ej4FQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-section": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-section/-/mjml-section-4.13.0.tgz", + "integrity": "sha512-BLcqlhavtRakKtzDQPLv6Ae4Jt4imYWq/P0jo+Sjk7tP4QifgVA2KEQOirPK5ZUqw/lvK7Afhcths5rXZ2ItnQ==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-social": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-social/-/mjml-social-4.13.0.tgz", + "integrity": "sha512-zL2a7Wwsk8OXF0Bqu+1B3La1UPwdTMcEXptO8zdh2V5LL6Xb7Gfyvx6w0CmmBtG5IjyCtqaKy5wtrcpG9Hvjfg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-spacer": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-spacer/-/mjml-spacer-4.13.0.tgz", + "integrity": "sha512-Acw4QJ0MJ38W4IewXuMX7hLaW1BZaln+gEEuTfrv0xwPdTxX1ILqz4r+s9mYMxYkIDLWMCjBvXyQK6aWlid13A==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-table": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-table/-/mjml-table-4.13.0.tgz", + "integrity": "sha512-UAWPVMaGReQhf776DFdiwdcJTIHTek3zzQ1pb+E7VlypEYgIpFvdUJ39UIiiflhqtdBATmHwKBOtePwU0MzFMg==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-text": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-text/-/mjml-text-4.13.0.tgz", + "integrity": "sha512-uDuraaQFdu+6xfuigCimbeznnOnJfwRdcCL1lTBTusTuEvW/5Va6m2D3mnMeEpl+bp4+cxesXIz9st6A9pcg5A==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0" + } + }, + "node_modules/mjml-validator": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-validator/-/mjml-validator-4.13.0.tgz", + "integrity": "sha512-uURYfyQYtHJ6Qz/1A7/+E9ezfcoISoLZhYK3olsxKRViwaA2Mm8gy/J3yggZXnsUXWUns7Qymycm5LglLEIiQg==", + "dependencies": { + "@babel/runtime": "^7.14.6" + } + }, + "node_modules/mjml-wrapper": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mjml-wrapper/-/mjml-wrapper-4.13.0.tgz", + "integrity": "sha512-p/44JvHg04rAFR7QDImg8nZucEokIjFH6KJMHxsO0frJtLZ+IuakctzlZAADHsqiR52BwocDsXSa+o9SE2l6Ng==", + "dependencies": { + "@babel/runtime": "^7.14.6", + "lodash": "^4.17.21", + "mjml-core": "4.13.0", + "mjml-section": "4.13.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "optional": true + }, + "node_modules/nestjs-paginate": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/nestjs-paginate/-/nestjs-paginate-4.13.0.tgz", + "integrity": "sha512-G0lIx5Ix5I964sLwq2a3Vn7hcC8azJ14PuCPDcGDod842KqjPZPfziAQbs5onQo9ymTS54J76grbzzyOSa6t0Q==", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@nestjs/common": "^9.3.9", + "express": "^4.18.2", + "fastify": "^4.14.0", + "typeorm": "^0.3.12" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==", + "peer": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", + "optional": true, + "peer": true + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseley": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.11.0.tgz", + "integrity": "sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.8.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-42": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/passport-42/-/passport-42-1.2.6.tgz", + "integrity": "sha512-a1SraWSwH33NqRDe9ScG4MQwfj7RRBYLFtrJySn4tU4Ou7+caLxj6VQgaL4i+eZoKC6QAooL1Nqevn/W8vLXuQ==", + "dependencies": { + "passport-oauth2": "^1.4.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/passport-oauth2": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.7.0.tgz", + "integrity": "sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ==", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + }, + "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/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/peberminta": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", + "integrity": "sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/pg": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "optional": true, + "peer": true, + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==", + "optional": true, + "peer": true + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "optional": true, + "peer": true, + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==", + "optional": true, + "peer": true + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "optional": true, + "peer": true, + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "optional": true, + "peer": true, + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/pick-util": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pick-util/-/pick-util-1.1.5.tgz", + "integrity": "sha512-H0MaM8T7wpQ/azvB12ChZw7kpSFzjsgv3Z+N7fUWnL1McTGSEeroCngcK4eOPiFQq08rAyKX3hadcAB1kUqfXA==", + "dependencies": { + "@jonkemp/package-utils": "^1.0.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==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", + "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", + "peer": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "peer": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.1.0.tgz", + "integrity": "sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==", + "peer": true + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "optional": true, + "peer": true, + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/preview-email": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/preview-email/-/preview-email-3.0.5.tgz", + "integrity": "sha512-q37jdkVw+wic0o/7xYhOTBS4kF0WX3two0OepmR1Fhxp9NTpO3rJTccAjQm95gJx/2Wa/Nv98sr9pXIQ77/foA==", + "deprecated": "Please upgrade to v3.0.7+ as we have added iOS Simulator support to previewing emails! See and screenshots at .", + "dependencies": { + "dayjs": "^1.10.6", + "debug": "^4.3.2", + "mailparser": "^3.3.0", + "nodemailer": "^6.6.3", + "open": "7", + "pug": "^3.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/preview-email/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "peer": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-warning": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", + "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==", + "peer": true + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "peer": true + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "peer": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remote-content": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remote-content/-/remote-content-3.0.1.tgz", + "integrity": "sha512-zEMsvb4GgxVKBBTHgy2tte67RYBZx2Kyg9mTYpg+JfATHDqYJqhuC3zG1VoiYhDVP5JaB5+mPKcAvdnT0n3jxA==", + "dependencies": { + "proxy-from-env": "^1.1.0", + "superagent": "^8.0.9", + "superagent-proxy": "^3.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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/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/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "peer": 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==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "peer": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "peer": true, + "dependencies": { + "ret": "~0.2.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", + "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "peer": true + }, + "node_modules/selderee": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.10.0.tgz", + "integrity": "sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==", + "dependencies": { + "parseley": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-cookie-parser": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", + "peer": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "engines": { + "node": "*" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/sonic-boom": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", + "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", + "peer": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "bin": { + "specificity": "bin/specificity" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "peer": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-data": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/style-data/-/style-data-2.0.1.tgz", + "integrity": "sha512-frUbteLGDoNEJhbMIWtyNE1VRduZXmZozhct4F+qN++OzIQZNZJ8KToZlDEl3eaedRYlDfKvUoMFMyrZj4x/sg==", + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "mediaquery-text": "^1.2.0", + "pick-util": "^1.1.5" + } + }, + "node_modules/superagent": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", + "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "dependencies": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.5.tgz", + "integrity": "sha512-V3eIa28lwB6gg7/wfNvAbjwJYmDXy1Jo1POjyTzlB6wPcHiGlRxq39TSjYGVjQrUSAzpv+a7nzp7mDxgNy57xA==" + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", + "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", + "peer": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tiny-lru": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.0.1.tgz", + "integrity": "sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tlds": { + "version": "1.236.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.236.0.tgz", + "integrity": "sha512-oP2PZ3KeGlgpHgsEfrtva3/K9kzsJUNliQSbCfrJ7JMCWFoCdtG+9YMq/g2AnADQ1v5tVlbtvKJZ4KLpy/P6MA==", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-jest": { + "version": "28.0.8", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz", + "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^28.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^28.0.0", + "babel-jest": "^28.0.0", + "jest": "^28.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typeorm": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.12.tgz", + "integrity": "sha512-sYSxBmCf1nJLLTcYtwqZ+lQIRtLPyUoO93rHTOKk9vJCyT4UfRtU7oRsJvfvKP3nnZTD1hzz2SEy2zwPEN6OyA==", + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^8.1.0", + "js-yaml": "^4.1.0", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "xml2js": "^0.4.23", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^3.6.0", + "mssql": "^7.3.0", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.5.tgz", + "integrity": "sha512-jbjfql+shJtAPrFoKxHOXip4xS+kul9W3OzfzzrqueWK2QMGon2bFH2opl6W9EagBThjEz+iysyi/swOoVfB/w==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.1.tgz", + "integrity": "sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "engines": { + "node": ">= 0.10" + } + }, + "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/vm2": { + "version": "3.9.14", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.14.tgz", + "integrity": "sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web-resource-inliner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-5.0.0.tgz", + "integrity": "sha512-AIihwH+ZmdHfkJm7BjSXiEClVt4zUFqX4YlFAzjL13wLtDuUneSaFvDBTbdYRecs35SiU7iNKbMnN+++wVfb6A==", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^4.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "optional": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/back/package.json b/back/package.json new file mode 100644 index 0000000..1141e2e --- /dev/null +++ b/back/package.json @@ -0,0 +1,94 @@ +{ + "name": "pong_server", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \".eslintrc.js\" \"src/**/*.ts\"", + "start": "nest start", + "dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \".eslintrc.js\" \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@nestjs-modules/mailer": "^1.8.1", + "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.1", + "@nestjs/core": "^9.0.0", + "@nestjs/jwt": "^10.0.2", + "@nestjs/mapped-types": "^1.2.2", + "@nestjs/passport": "^9.0.3", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/platform-socket.io": "^9.3.9", + "@nestjs/schedule": "^2.2.0", + "@nestjs/swagger": "^6.2.1", + "@nestjs/testing": "^9.0.0", + "@nestjs/typeorm": "^9.0.1", + "@nestjs/websockets": "^9.2.0", + "@types/bcrypt": "^5.0.0", + "@types/cookie-parser": "^1.4.3", + "@types/express": "^4.17.13", + "@types/express-session": "^1.17.6", + "@types/multer": "^1.4.7", + "@types/node": "^16.18.14", + "@types/passport": "^1.0.12", + "bcrypt": "^5.1.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "cookie-parser": "^1.4.6", + "express": "^4.18.2", + "express-session": "^1.17.3", + "multer": "^1.4.5-lts.1", + "nestjs-paginate": "^4.13.0", + "nodemailer": "^6.9.1", + "passport": "^0.6.0", + "passport-42": "^1.2.6", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.8.0", + "socket.io": "^4.6.1", + "source-map-support": "^0.5.21", + "typeorm": "^0.3.12" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.34.0", + "eslint-config-standard-with-typescript": "^34.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-promise": "^6.1.1", + "jest": "28.1.3", + "prettier": "^2.3.2", + "ts-jest": "28.0.8", + "ts-node": "^10.0.0", + "typescript": "^4.9.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/back/src/app.module.ts b/back/src/app.module.ts new file mode 100644 index 0000000..964a73f --- /dev/null +++ b/back/src/app.module.ts @@ -0,0 +1,32 @@ +import { Module } from '@nestjs/common' +import { TypeOrmModule } from '@nestjs/typeorm' +import { ScheduleModule } from '@nestjs/schedule' + +import { AuthModule } from './auth/auth.module' +import { ChatModule } from './chat/chat.module' +import { PongModule } from './pong/pong.module' +import { UsersModule } from './users/users.module' + +@Module({ + imports: [ + ScheduleModule.forRoot(), + TypeOrmModule.forRootAsync({ + useFactory: () => ({ + type: 'postgres', + host: process.env.POSTGRES_HOST || 'localhost', + port: (process.env.POSTGRES_PORT || 5432) as number, + username: process.env.POSTGRES_USER || 'postgres', + password: process.env.POSTGRES_PASSWORD || 'postgres', + database: process.env.POSTGRES_DB || 'postgres', + jwt_secret: process.env.JWT_SECRET || 'secret', + autoLoadEntities: true, + synchronize: true + }) + }), + AuthModule, + ChatModule, + PongModule, + UsersModule + ] +}) +export class AppModule {} diff --git a/back/src/auth/42-auth.guard.ts b/back/src/auth/42-auth.guard.ts new file mode 100644 index 0000000..3f5f530 --- /dev/null +++ b/back/src/auth/42-auth.guard.ts @@ -0,0 +1,25 @@ +import { + type ExecutionContext, + Injectable, + type CanActivate +} from '@nestjs/common' +import { AuthGuard } from '@nestjs/passport' +import { type Request } from 'express' + +@Injectable() +export class FtOauthGuard extends AuthGuard('42') { + async canActivate (context: ExecutionContext): Promise { + const activate: boolean = (await super.canActivate(context)) as boolean + const request: Request = context.switchToHttp().getRequest() + await super.logIn(request) + return activate + } +} + +@Injectable() +export class AuthenticatedGuard implements CanActivate { + async canActivate (context: ExecutionContext): Promise { + const req: Request = context.switchToHttp().getRequest() + return req.isAuthenticated() + } +} diff --git a/back/src/auth/42.decorator.ts b/back/src/auth/42.decorator.ts new file mode 100644 index 0000000..912cee6 --- /dev/null +++ b/back/src/auth/42.decorator.ts @@ -0,0 +1,9 @@ +import { createParamDecorator, type ExecutionContext } from '@nestjs/common' +import { type Profile } from 'passport-42' + +export const Profile42 = createParamDecorator( + (data: unknown, ctx: ExecutionContext): Profile => { + const request = ctx.switchToHttp().getRequest() + return request.user + } +) diff --git a/back/src/auth/42.strategy.ts b/back/src/auth/42.strategy.ts new file mode 100644 index 0000000..5b02f7d --- /dev/null +++ b/back/src/auth/42.strategy.ts @@ -0,0 +1,48 @@ +import { Injectable } from '@nestjs/common' +import { ConfigService } from '@nestjs/config' +import { PassportStrategy } from '@nestjs/passport' +import { Strategy, type Profile, type VerifyCallback } from 'passport-42' +import { get } from 'https' +import { createWriteStream } from 'fs' + +import { UsersService } from 'src/users/users.service' +import { User } from 'src/users/entity/user.entity' + +@Injectable() +export class FtStrategy extends PassportStrategy(Strategy, '42') { + constructor ( + private readonly usersService: UsersService + ) { + super({ + clientID: process.env.FT_OAUTH_CLIENT_ID, + clientSecret: process.env.FT_OAUTH_CLIENT_SECRET, + callbackURL: process.env.FT_OAUTH_CALLBACK_URL, + passReqToCallback: true + }) + } + + async validate ( + request: { session: { accessToken: string } }, + accessToken: string, + refreshToken: string, + profile: Profile, + cb: VerifyCallback + ): Promise { + request.session.accessToken = accessToken + const ftId = profile.id as number + console.log('Validated ', profile.username) + if ((await this.usersService.findUser(ftId)) === null) { + const newUser = new User() + newUser.ftId = profile.id as number + newUser.username = profile.username + newUser.avatar = `${ftId}.jpg` + newUser.email = profile.emails[0].value + void this.usersService.create(newUser) + const file = createWriteStream(`avatars/${ftId}.jpg`) + get(profile._json.image.versions.small, function (response) { + response.pipe(file) + }) + } + return cb(null, profile) + } +} diff --git a/back/src/auth/auth.controller.ts b/back/src/auth/auth.controller.ts new file mode 100644 index 0000000..8322c40 --- /dev/null +++ b/back/src/auth/auth.controller.ts @@ -0,0 +1,83 @@ +import { + Controller, + Get, + Redirect, + UseGuards, + Res, + Req, + Post, + Body, + BadRequestException, + Param +} from '@nestjs/common' +import { Response, Request } from 'express' + +import { FtOauthGuard, AuthenticatedGuard } from './42-auth.guard' +import { Profile } from 'passport-42' +import { Profile42 } from './42.decorator' + +import { AuthService } from './auth.service' +import { UsersService } from 'src/users/users.service' +import { EmailDto } from 'src/chat/dto/updateUser.dto' +import type User from 'src/users/entity/user.entity' + +const frontHost = + process.env.HOST !== undefined && process.env.HOST !== '' + ? process.env.HOST + : 'localhost' +const frontPort = + process.env.PORT !== undefined && process.env.HOST !== '' + ? process.env.PORT + : '80' + +@Controller('log') +export class AuthController { + constructor ( + private readonly authService: AuthService, + private readonly usersService: UsersService + ) {} + + @Get('in') + @UseGuards(FtOauthGuard) + ftAuth (): void {} + + @Get('inReturn') + @UseGuards(FtOauthGuard) + @Redirect(`http://${frontHost}:${frontPort}/profile`) + ftAuthCallback ( + @Res({ passthrough: true }) response: Response, + @Req() request: Request + ): any { + console.log('cookie:', request.cookies['connect.sid']) + response.cookie('connect.sid', request.cookies['connect.sid']) + } + + @Get('/verify') + @UseGuards(AuthenticatedGuard) + async VerifyEmail (@Profile42() profile: Profile): Promise { + const ftId: number = profile.id + const user = await this.usersService.findUser(ftId) + if (user == null) throw new BadRequestException('User not found') + await this.authService.sendConfirmationEmail(user) + } + + @Get('/verify/:code') + @Redirect(`http://${frontHost}:${frontPort}`) + async Verify (@Param("code") code: string): Promise { + await this.authService.verifyAccount(code) + } + + @Get('profile') + @UseGuards(AuthenticatedGuard) + profile (@Profile42() user: Profile): any { + return { user } + } + + @Get('out') + @Redirect(`http://${frontHost}:${frontPort}`) + logOut (@Req() req: Request): any { + req.logOut(function (err) { + if (err != null) return err + }) + } +} diff --git a/back/src/auth/auth.module.ts b/back/src/auth/auth.module.ts new file mode 100644 index 0000000..d3715f0 --- /dev/null +++ b/back/src/auth/auth.module.ts @@ -0,0 +1,54 @@ +import { Module } from '@nestjs/common' +import { UsersModule } from 'src/users/users.module' +import { PassportModule } from '@nestjs/passport' +import { ConfigModule, ConfigService } from '@nestjs/config' +import { AuthController } from './auth.controller' +import { FtStrategy } from './42.strategy' +import { SessionSerializer } from './session.serializer' +import { JwtModule } from '@nestjs/jwt' +import { MailerModule } from '@nestjs-modules/mailer' +import { AuthService } from './auth.service' +import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter' + +const mailUser = + process.env.MAIL_USER !== null && process.env.MAIL_USER !== '' + ? process.env.MAIL_USER + : '' +const mailPass = + process.env.MAIL_PASSWORD !== null && process.env.MAIL_PASSWORD !== '' + ? process.env.MAIL_PASSWORD + : '' + +@Module({ + imports: [ + UsersModule, + PassportModule, + ConfigModule.forRoot(), + JwtModule.register({ + secret: process.env.JWT_SECRET, + signOptions: { expiresIn: '60s' } + }), + MailerModule.forRoot({ + transport: { + service: 'gmail', + auth: { + user: mailUser, + pass: mailPass + } + }, + template: { + dir: 'src/auth/mails', + adapter: new HandlebarsAdapter(), + options: { + strict: true + } + }, + defaults: { + from: '"No Reply" vaganiwast@gmail.com' + } + }) + ], + providers: [ConfigService, FtStrategy, SessionSerializer, AuthService], + controllers: [AuthController] +}) +export class AuthModule {} diff --git a/back/src/auth/auth.service.ts b/back/src/auth/auth.service.ts new file mode 100644 index 0000000..df1e993 --- /dev/null +++ b/back/src/auth/auth.service.ts @@ -0,0 +1,53 @@ +import { BadRequestException, Injectable } from '@nestjs/common' +import { type User } from 'src/users/entity/user.entity' +import { UsersService } from 'src/users/users.service' +import { MailerService } from '@nestjs-modules/mailer' + +@Injectable() +export class AuthService { + constructor ( + private readonly usersService: UsersService, + private readonly mailerService: MailerService + ) {} + + async sendConfirmedEmail (user: User): Promise { + const { email, username } = user + await this.mailerService.sendMail({ + to: email, + subject: 'Welcome to ft_transcendence! Email Confirmed', + template: 'confirmed', + context: { + username, + email + } + }) + } + + async sendConfirmationEmail (user: User): Promise { + user.authToken = Math.floor(10000 + Math.random() * 90000).toString() + await this.usersService.save(user) + try { + await this.mailerService.sendMail({ + to: user.email, + subject: 'Welcome to ft_transcendence! Confirm Email', + template: 'confirm', + context: { + username: user.username, + code: user.authToken + } + }) + } catch { + throw new BadRequestException("Email doesnt't seem to be valid") + } + console.log(`email sent to ${user.email}`) + } + + async verifyAccount (code: string): Promise { + const user = await this.usersService.findByCode(code) + user.authToken = '' + user.isVerified = true + await this.usersService.save(user) + await this.sendConfirmedEmail(user) + return true + } +} diff --git a/back/src/auth/mails/confirm.hbs b/back/src/auth/mails/confirm.hbs new file mode 100644 index 0000000..a77724e --- /dev/null +++ b/back/src/auth/mails/confirm.hbs @@ -0,0 +1,15 @@ + + + + + + Transcendence confirmation mail + + +

Hello {{username}}!

+

Once you clicked on the next verify button, you will have access to the app

+ + + + + diff --git a/back/src/auth/mails/confirmed.hbs b/back/src/auth/mails/confirmed.hbs new file mode 100644 index 0000000..271b2f5 --- /dev/null +++ b/back/src/auth/mails/confirmed.hbs @@ -0,0 +1,12 @@ + + + + + + Welcome to transcendence + + +

Hello {{username}}!

+

You well verified your account for this session.

+ + diff --git a/back/src/auth/session.serializer.ts b/back/src/auth/session.serializer.ts new file mode 100644 index 0000000..7698561 --- /dev/null +++ b/back/src/auth/session.serializer.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@nestjs/common' +import { PassportSerializer } from '@nestjs/passport' +import { type Profile } from 'passport-42' + +@Injectable() +export class SessionSerializer extends PassportSerializer { + serializeUser ( + user: Profile, + done: (err: Error | null, user: Profile) => void + ): any { + done(null, user) + } + + deserializeUser ( + payload: Profile, + done: (err: Error | null, user: Profile) => void + ): any { + done(null, payload) + } +} diff --git a/back/src/chat/chat.controller.ts b/back/src/chat/chat.controller.ts new file mode 100644 index 0000000..dbbe2ab --- /dev/null +++ b/back/src/chat/chat.controller.ts @@ -0,0 +1,249 @@ +import { + BadRequestException, + Body, + Controller, + Delete, + Get, + NotFoundException, + Param, + ParseIntPipe, + Post, + UseGuards +} from '@nestjs/common' +import { AuthenticatedGuard } from 'src/auth/42-auth.guard' +import { UsersService } from 'src/users/users.service' +import { ChatService } from './chat.service' + +import { CreateChannelDto } from './dto/create-channel.dto' +import { IdDto, PasswordDto, MuteDto } from './dto/updateUser.dto' + +import type User from 'src/users/entity/user.entity' +import type Channel from './entity/channel.entity' +import { Profile42 } from 'src/auth/42.decorator' +import { Profile } from 'passport-42' + +@Controller('channels') +@UseGuards(AuthenticatedGuard) +export class ChatController { + constructor ( + private readonly channelService: ChatService, + private readonly usersService: UsersService + ) {} + + @Get('dms/:otherName') + async getDMsForUser ( + @Profile42() profile: Profile, + @Param('otherName') otherName: string + ): Promise { + const user = await this.usersService.findUser(+profile.id) + const other = await this.usersService.findUserByName(otherName) + const channels = await this.channelService.getChannelsForUser(+profile.id) + + if (user === null || other === null) { + throw new BadRequestException('User not found') + } + const dms = channels.filter((channel: Channel) => { + return ( + (channel.name === `${user.ftId}&${other.ftId}` || + channel.name === `${other.ftId}&${user.ftId}`) + ) + }) + if (dms.length === 0) { + throw new BadRequestException('No DMS found') + } + return dms + } + + @Post(':id/invite') + async addUser ( + @Param('id', ParseIntPipe) id: number, + @Body() target: IdDto, + @Profile42() profile: Profile + ): Promise { + const channel = await this.channelService.getFullChannel(id) + const user: User | null = await this.usersService.getFullUser(target.id) + if (user == null || target === undefined) { + throw new NotFoundException(`User #${target.id} not found`) + } + if (!(await this.channelService.isUser(channel.id, +profile.id))) { + throw new BadRequestException( + 'You are not allowed to invite users to this channel' + ) + } + if (await this.channelService.isUser(channel.id, target.id)) { + throw new BadRequestException('User is already in this channel') + } + if (await this.channelService.isBanned(channel.id, target.id)) { + throw new BadRequestException('User is banned from this channel') + } + channel.users.push(user) + await this.channelService.save(channel) + } + + @Get(':id/users') + async getUsersOfChannel ( + @Param('id', ParseIntPipe) id: number + ): Promise { + const users = (await this.channelService.getFullChannel(id)).users + users.forEach((u) => (u.socketKey = '')) + return users + } + + @Post(':id/admin') + async addAdmin ( + @Param('id', ParseIntPipe) id: number, + @Body() target: IdDto, + @Profile42() profile: Profile + ): Promise { + const channel = await this.channelService.getFullChannel(id) + const user: User | null = await this.usersService.findUser(target.id) + if (user == null) { + throw new NotFoundException(`User #${target.id} not found`) + } + if (!(await this.channelService.isOwner(channel.id, +profile.id))) { + throw new BadRequestException('You are not the owner of this channel') + } + if (!(await this.channelService.isUser(channel.id, target.id))) { + throw new BadRequestException('User is not in this channel') + } + if (await this.channelService.isAdmin(channel.id, target.id)) { + throw new BadRequestException('User is already an admin of this channel') + } + channel.admins.push(user) + await this.channelService.save(channel) + } + + @Delete(':id/admin') + async removeAdmin ( + @Param('id', ParseIntPipe) id: number, + @Body() target: IdDto, + @Profile42() profile: Profile + ): Promise { + const channel = await this.channelService.getFullChannel(id) + if (await this.channelService.isOwner(channel.id, target.id)) { + throw new BadRequestException('The owner cannot be demoted') + } + if (!(await this.channelService.isOwner(channel.id, +profile.id))) { + throw new BadRequestException('You are not the owner of this channel') + } + if (!(await this.channelService.isAdmin(channel.id, target.id))) { + throw new BadRequestException('User is not an admin of this channel') + } + channel.admins = channel.admins.filter((usr: User) => { + return usr.ftId !== target.id + }) + await this.channelService.save(channel) + } + + @Post(':id/ban') + async addBan ( + @Param('id', ParseIntPipe) id: number, + @Body() target: MuteDto, + @Profile42() profile: Profile + ): Promise { + const channel = await this.channelService.getFullChannel(id) + const user: User | null = await this.usersService.findUser(+target.data[0]) + if (isNaN(+target.data[1])) { + throw new BadRequestException('Invalid duration') + } + if (user == null) { + throw new NotFoundException(`User #${+target.data[0]} not found`) + } + if (!(await this.channelService.isAdmin(channel.id, +profile.id))) { + throw new BadRequestException( + 'You are not allowed to ban users from this channel' + ) + } + if (await this.channelService.isOwner(channel.id, +target.data[0])) { + throw new BadRequestException('You cannot ban the owner of the channel') + } + if (await this.channelService.isBanned(channel.id, +target.data[0])) { + throw new BadRequestException('User is already banned from this channel') + } + channel.banned.push([+target.data[0], Date.now() + +target.data[1] * 1000]) + await this.channelService.save(channel) + } + + @Post(':id/mute') + async addMute ( + @Param('id', ParseIntPipe) id: number, + @Body() mute: MuteDto, // [userId, duration] + @Profile42() profile: Profile + ): Promise { + const channel = await this.channelService.getFullChannel(id) + const user: User | null = await this.usersService.findUser(+mute.data[0]) + if (isNaN(+mute.data[1])) { + throw new BadRequestException('Invalid duration') + } + if (user == null) { + throw new NotFoundException(`User #${+mute.data[0]} not found`) + } + if (!(await this.channelService.isAdmin(channel.id, +profile.id))) { + throw new BadRequestException( + 'You are not allowed to mute users from this channel' + ) + } + if (await this.channelService.isOwner(channel.id, +mute.data[0])) { + throw new BadRequestException('You cannot mute the owner of the channel') + } + if (await this.channelService.isMuted(channel.id, +mute.data[0])) { + throw new BadRequestException('User is already muted from this channel') + } + const newMute: number[] = [+mute.data[0], Date.now() + +mute.data[1] * 1000] + channel.muted.push(newMute) + await this.channelService.save(channel) + } + + @Delete(':id') + async deleteChannel ( + @Profile42() profile: Profile, + @Param('id', ParseIntPipe) id: number + ): Promise { + if (!(await this.channelService.isOwner(id, +profile.id))) { + throw new BadRequestException('You are not the owner of this channel') + } + await this.channelService.removeChannel(id) + } + + @Post(':id/password') + async updatePassword ( + @Profile42() profile: Profile, + @Param('id', ParseIntPipe) id: number, + @Body() data: PasswordDto + ): Promise { + if (!(await this.channelService.isOwner(id, +profile.id))) { + throw new BadRequestException('You are not the owner of this channel') + } + let channel = (await this.channelService.getChannel(id)) as Channel + if (channel.isDM) throw new BadRequestException('You cannot set a password on a DM channel') + channel.password = await this.channelService.hash(data.password) + this.channelService.update(channel) + } + + @Get(':id') + async getChannel (@Param('id', ParseIntPipe) id: number): Promise { + const chan = await this.channelService.getFullChannel(id) + if (chan == null) { + throw new NotFoundException(`Channel #${id} not found`) + } + chan.users.forEach((u) => (u.socketKey = '')) + chan.admins.forEach((u) => (u.socketKey = '')) + chan.owner.socketKey = '' + return chan + } + + @Get() + async getChannelsForUser (@Profile42() profile: Profile): Promise { + const chan = await this.channelService.getChannelsForUser(+profile.id) + return chan + } + + @Post() + async createChannel (@Body() channel: CreateChannelDto): Promise { + const chan = await this.channelService.createChannel(channel) + chan.users.forEach((u) => (u.socketKey = '')) + chan.admins.forEach((u) => (u.socketKey = '')) + chan.owner.socketKey = '' + return chan + } +} diff --git a/back/src/chat/chat.gateway.ts b/back/src/chat/chat.gateway.ts new file mode 100644 index 0000000..b82ed74 --- /dev/null +++ b/back/src/chat/chat.gateway.ts @@ -0,0 +1,164 @@ +import { + type OnGatewayConnection, + type OnGatewayDisconnect, + SubscribeMessage, + WebSocketGateway, + WebSocketServer, + WsException, +} from '@nestjs/websockets'; +import { Socket, Server } from 'socket.io'; +// import { User } from 'users/user.entity'; +import { UsersService } from 'src/users/users.service'; +import { ChatService } from './chat.service'; +import type Message from './entity/message.entity'; +import * as bcrypt from 'bcrypt'; +import { MessageService } from './message.service'; +import { CreateMessageDto } from './dto/create-message.dto'; +import { ConnectionDto } from './dto/connection.dto'; +import { kickUserDto } from './dto/kickUser.dto'; +import ConnectedUser from './entity/connection.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import type User from 'src/users/entity/user.entity'; +import Channel from './entity/channel.entity'; + +@WebSocketGateway({ + cors: { + origin: new RegExp( + `^(http|ws)://${process.env.HOST ?? 'localhost'}(:\\d+)?$` + ), + }, +}) +export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect { + @WebSocketServer() + server: Server; + + constructor( + private readonly userService: UsersService, + private readonly messageService: MessageService, + private readonly chatService: ChatService, + @InjectRepository(ConnectedUser) + private readonly connectedUserRepository: Repository + ) {} + + async handleConnection(socket: Socket): Promise {} + + async handleDisconnect(socket: Socket): Promise { + const connect = await this.connectedUserRepository.findOneBy({ + socket: socket.id + }); + if (connect) { + console.log('socket %s has disconnected', socket.id) + await this.connectedUserRepository.delete({ user: connect.user }) + } + } + + @SubscribeMessage('joinChannel') + async onJoinChannel(socket: Socket, connect: ConnectionDto): Promise { + await this.connectedUserRepository.delete({ user: connect.UserId }) + const channel = await this.chatService.getFullChannel(connect.ChannelId); + if (channel.banned.some((ban) => +ban[0] === +connect.UserId)) { + this.server + .to(socket.id) + .emit('failedJoin', 'You are banned from this channel'); + throw new WsException('You are banned from this channel'); + } + const user = await this.userService.getFullUser(connect.UserId); + if (connect.socketKey !== user.socketKey) { + this.server.to(socket.id).emit('failedJoin', 'Wrong socket key'); + throw new WsException('Wrong socket key'); + } + user.socketKey = ''; + if (channel.password && channel.password !== '') { + if ( + !connect.pwd || + !(await bcrypt.compare(connect.pwd, channel.password)) + ) { + this.server.to(socket.id).emit('failedJoin', 'Wrong password'); + throw new WsException('Wrong password'); + } + } + await this.chatService.addUserToChannel(channel, user); + const messages = await this.messageService.findMessagesInChannelForUser( + channel, + user + ); + const conUser = new ConnectedUser(); + conUser.user = user.ftId; + conUser.channel = channel.id; + conUser.socket = socket.id; + await this.connectedUserRepository.save(conUser); + await socket.join(channel.id.toString()); + this.server.to(socket.id).emit('messages', messages); + } + + @SubscribeMessage('leaveChannel') + async onLeaveChannel(socket: Socket): Promise { + const connect = await this.connectedUserRepository.findOneBy({ + socket: socket.id, + }); + if (connect == null) return false; + const channel = await this.chatService.getFullChannel(connect.channel); + if (connect.user === channel.owner.ftId) { + this.server.in(channel.id.toString()).emit('deleted'); + await this.chatService.removeChannel(channel.id); + } else { + channel.users = channel.users.filter((usr: User) => usr.ftId !== connect.user); + channel.admins = channel.admins.filter((usr: User) => usr.ftId !== connect.user); + await this.chatService.save(channel); + } + await this.connectedUserRepository.delete({ socket: socket.id }); + console.log('socket %s has left channel', socket.id) + return true; + } + + @SubscribeMessage('addMessage') + async onAddMessage (socket: Socket, message: CreateMessageDto): Promise { + const connect = await this.connectedUserRepository.findOneBy({ + socket: socket.id, + }); + if (connect == null) throw new WsException('You must be connected to the channel'); + let channel: Channel | null = null + channel = await this.chatService.getChannel(message.ChannelId).catch(() => { return null }) + if (channel == null) { + this.server.to(socket.id).emit('deleted') + throw new WsException('Channel has been deleted'); + } + if (await this.chatService.isMuted(channel.id, message.UserId)) { + throw new WsException('You are muted'); + } + const createdMessage: Message = await this.messageService.createMessage( + message + ); + this.server.to(channel.id.toString()).emit('newMessage', createdMessage); + } + + @SubscribeMessage('kickUser') + async onKickUser(socket: Socket, kick: kickUserDto): Promise { + let connect = (await this.connectedUserRepository.findOneBy({ + socket: socket.id + })) + if (connect === null) + throw new WsException('You must be connected to the channel') + const channel = await this.chatService.getFullChannel(kick.chan); + if (channel.owner.ftId === kick.to) { + throw new WsException('You cannot kick the owner of a channel'); + } + if ( + channel.owner.ftId !== kick.from && + !channel.admins.some((usr) => +usr.ftId === kick.from) + ) { + throw new WsException('You do not have the required privileges') + } + const target = (await this.userService.findUser(kick.to)) as User + connect = (await this.connectedUserRepository.findOneBy({ + user: target.ftId + })) + if (connect !== null) { + console.log(`kicking ${target.username} from ${channel.name} with socket ${connect.socket}`) + this.server.to(connect.socket).emit('kicked') + } else { + throw new WsException('Target is not connected to the channel') + } + } +} diff --git a/back/src/chat/chat.module.ts b/back/src/chat/chat.module.ts new file mode 100644 index 0000000..8909b26 --- /dev/null +++ b/back/src/chat/chat.module.ts @@ -0,0 +1,25 @@ +import { Module } from '@nestjs/common' +import { TypeOrmModule } from '@nestjs/typeorm' + +import { AuthModule } from 'src/auth/auth.module' +import { UsersModule } from 'src/users/users.module' +import { ChatGateway } from './chat.gateway' +import { ChatController } from './chat.controller' +import { ChatService } from './chat.service' +import { MessageService } from './message.service' + +import Channel from './entity/channel.entity' +import Message from './entity/message.entity' +import ConnectedUser from './entity/connection.entity' + +@Module({ + imports: [ + UsersModule, + AuthModule, + TypeOrmModule.forFeature([Channel, Message, ConnectedUser]) + ], + controllers: [ChatController], + providers: [ChatService, ChatGateway, MessageService], + exports: [ChatService] +}) +export class ChatModule {} diff --git a/back/src/chat/chat.service.ts b/back/src/chat/chat.service.ts new file mode 100644 index 0000000..ffcac7e --- /dev/null +++ b/back/src/chat/chat.service.ts @@ -0,0 +1,214 @@ +import { BadRequestException, Injectable } from '@nestjs/common' +import { InjectRepository } from '@nestjs/typeorm' +import { Repository } from 'typeorm' +import { Cron } from '@nestjs/schedule' +import * as bcrypt from 'bcrypt' + +import { type CreateChannelDto } from './dto/create-channel.dto' +import { UsersService } from 'src/users/users.service' + +import type User from 'src/users/entity/user.entity' +import Channel from './entity/channel.entity' + +@Injectable() +export class ChatService { + constructor ( + @InjectRepository(Channel) + private readonly ChannelRepository: Repository, + private readonly usersService: UsersService + ) {} + + async createChannel (channel: CreateChannelDto): Promise { + const user: User | null = await this.usersService.getFullUser(channel.owner) + if (user == null) { + throw new BadRequestException(`User #${channel.owner} not found`) + } + + let newChannel: Channel + if (channel.isDM) { + if (channel.otherDMedUsername === undefined || channel.otherDMedUsername === null) { + throw new BadRequestException('No other user specified') + } + const otherUser: User | null = await this.usersService.findUserByName( + channel.otherDMedUsername + ) + if (otherUser == null) throw new BadRequestException(`User #${channel.otherDMedUsername} not found`) + if (user.blocked.some((usr: User) => usr.ftId === otherUser.ftId)) { + throw new BadRequestException(`User ${otherUser.username} is blocked`) + } + if (otherUser.id === user.id) throw new BadRequestException('Cannot DM yourself') + + const channels = await this.getChannelsForUser(user.id) + const dmAlreadyExists = channels.find((channel: Channel) => { + return ( + (channel.name === `${user.ftId}&${otherUser.ftId}` || + channel.name === `${otherUser.ftId}&${user.ftId}`) + ) + }) + if (dmAlreadyExists !== undefined) { + throw new BadRequestException('DM already exists') + } + + newChannel = this.createDM(user, otherUser) + } else { + newChannel = new Channel() + newChannel.owner = user + newChannel.users = [user] + newChannel.admins = [user] + newChannel.name = channel.name + newChannel.isPrivate = channel.isPrivate + newChannel.password = await this.hash(channel.password) + newChannel.isDM = false + console.log('New channel: ', JSON.stringify(newChannel)) + } + return await this.ChannelRepository.save(newChannel) + } + + createDM (user: User, otherUser: User): Channel { + const newDM = new Channel() + newDM.isPrivate = true + newDM.password = '' + newDM.owner = user + newDM.users = [user, otherUser] + newDM.admins = [user] + newDM.name = `${user.ftId}&${otherUser.ftId}` + newDM.isDM = true + return newDM + } + + async hash(password: string): Promise { + if (!password) return '' + password = await bcrypt.hash( + password, + Number(process.env.HASH_SALT) + ) + return password + } + + async getChannelsForUser (ftId: number): Promise { + let rooms: Channel[] = [] + rooms = [ + ...(await this.ChannelRepository.createQueryBuilder('room') + .where('room.isPrivate = false') + .orderBy('room.id', 'DESC') + .getMany()) + ] + + rooms = [ + ...rooms, + ...(await this.ChannelRepository.createQueryBuilder('room') + .innerJoin('room.users', 'users') + .where('room.isPrivate = true') + .andWhere('users.ftId = :ftId', { ftId }) + .getMany()) + ] + return rooms + } + + @Cron('*/10 * * * * *') + async updateBanlists (): Promise { + const channels = await this.ChannelRepository.find({}) + for (const channel of channels) { + channel.banned = channel.banned.filter((data) => { + return Date.now() - data[1] < 0 + }) + channel.muted = channel.muted.filter((data) => { + return Date.now() - data[1] < 0 + }) + void this.update(channel) + } + } + + async addUserToChannel (channel: Channel, user: User): Promise { + channel.users.push(user) + await this.save(channel) + return channel + } + + async getChannel (id: number): Promise { + const channel = await this.ChannelRepository.findOneBy({ id }) + if (channel == null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel + } + + // Warning: those channels users contains socketKey. + // they have to be hidden before returned from a route + // but not save them without the key. + async getFullChannel (id: number): Promise { + const channel = await this.ChannelRepository.findOne({ + where: { id }, + relations: ['users', 'admins', 'owner'] + }) + if (channel == null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel + } + + async update (channel: Channel): Promise { + await this.ChannelRepository.update(channel.id, channel) + } + + async save (channel: Channel): Promise { + await this.ChannelRepository.save(channel) + } + + async removeChannel (channelId: number): Promise { + await this.ChannelRepository.remove(await this.getFullChannel(channelId)) + } + + async isOwner (id: number, userId: number): Promise { + const channel = await this.ChannelRepository.findOne({ + where: { id }, + relations: { owner: true } + }) + if (channel === null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel.owner.ftId === userId + } + + async isAdmin (id: number, userId: number): Promise { + const channel = await this.ChannelRepository.findOne({ + where: { id }, + relations: { admins: true } + }) + if (channel === null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel.admins.some((user) => user.ftId === userId) + } + + async isUser (id: number, userId: number): Promise { + const channel = await this.ChannelRepository.findOne({ + where: { id }, + relations: { users: true } + }) + if (channel === null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel.users.some((user) => user.ftId === userId) + } + + async isBanned (id: number, userId: number): Promise { + const channel = await this.ChannelRepository.findOne({ + where: { id } + }) + if (channel === null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel.banned.some((ban) => +ban[0] === userId) + } + + async isMuted (id: number, userId: number): Promise { + const channel = await this.ChannelRepository.findOne({ + where: { id } + }) + if (channel === null) { + throw new BadRequestException(`Channel #${id} not found`) + } + return channel.muted.some((mute) => +mute[0] === userId) + } +} diff --git a/back/src/chat/dto/connection.dto.ts b/back/src/chat/dto/connection.dto.ts new file mode 100644 index 0000000..03dd9d9 --- /dev/null +++ b/back/src/chat/dto/connection.dto.ts @@ -0,0 +1,17 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString } from 'class-validator' + +export class ConnectionDto { + @IsString() + @IsNotEmpty() + socketKey: string + + @IsNumber() + UserId: number + + @IsNumber() + ChannelId: number + + @IsString() + @IsOptional() + pwd: string +} diff --git a/back/src/chat/dto/create-channel.dto.ts b/back/src/chat/dto/create-channel.dto.ts new file mode 100644 index 0000000..c3f8973 --- /dev/null +++ b/back/src/chat/dto/create-channel.dto.ts @@ -0,0 +1,31 @@ +import { Transform } from 'class-transformer' +import { + IsPositive, + IsString, + IsOptional, + IsNumber, + IsBoolean +} from 'class-validator' + +export class CreateChannelDto { + @IsString() + name: string + + @IsNumber() + owner: number + + @IsOptional() + password: string + + @IsBoolean() + @Transform(({ value }) => value === 'true') + isPrivate: boolean + + @IsBoolean() + @IsOptional() + isDM: boolean + + @IsString() + @IsOptional() + otherDMedUsername: string +} diff --git a/back/src/chat/dto/create-message.dto.ts b/back/src/chat/dto/create-message.dto.ts new file mode 100644 index 0000000..56419a0 --- /dev/null +++ b/back/src/chat/dto/create-message.dto.ts @@ -0,0 +1,12 @@ +import { IsNumber, IsString } from 'class-validator' + +export class CreateMessageDto { + @IsString() + text: string + + @IsNumber() + UserId: number + + @IsNumber() + ChannelId: number +} diff --git a/back/src/chat/dto/kickUser.dto.ts b/back/src/chat/dto/kickUser.dto.ts new file mode 100644 index 0000000..f626ede --- /dev/null +++ b/back/src/chat/dto/kickUser.dto.ts @@ -0,0 +1,12 @@ +import { IsNumber } from 'class-validator' + +export class kickUserDto { + @IsNumber() + chan: number + + @IsNumber() + from: number + + @IsNumber() + to: number +} diff --git a/back/src/chat/dto/update-channel.dto.ts b/back/src/chat/dto/update-channel.dto.ts new file mode 100644 index 0000000..c9cb3a3 --- /dev/null +++ b/back/src/chat/dto/update-channel.dto.ts @@ -0,0 +1,30 @@ +import { PartialType } from '@nestjs/mapped-types' +import { CreateChannelDto } from './create-channel.dto' +import { IsNumber, IsOptional, IsString } from 'class-validator' + +export class UpdateChannelDto extends PartialType(CreateChannelDto) { + id: number + @IsOptional() + @IsNumber() + users: [number] + + @IsOptional() + @IsNumber() + messages: [number] + + @IsOptional() + @IsNumber() + owners: [number] // user id + + @IsOptional() + @IsNumber() + banned: [number] // user id + + @IsOptional() + @IsNumber() + muted: [number] // user id + + @IsString() + @IsOptional() + password: string +} diff --git a/back/src/chat/dto/updateUser.dto.ts b/back/src/chat/dto/updateUser.dto.ts new file mode 100644 index 0000000..d13d70c --- /dev/null +++ b/back/src/chat/dto/updateUser.dto.ts @@ -0,0 +1,25 @@ +import { Type } from 'class-transformer' +import { IsArray, IsEmail, IsNumber, IsPositive, IsString } from 'class-validator' + +export class IdDto { + @IsNumber() + id: number +} + +export class PasswordDto { + @IsString() + password: string +} + +export class MuteDto { + @Type(() => Number) + @IsArray() + @IsNumber({}, { each: true }) + @IsPositive({ each: true }) + data: number[] +} + +export class EmailDto { + @IsEmail() + email: string +} diff --git a/back/src/chat/entity/channel.entity.ts b/back/src/chat/entity/channel.entity.ts new file mode 100644 index 0000000..8d4f2f1 --- /dev/null +++ b/back/src/chat/entity/channel.entity.ts @@ -0,0 +1,52 @@ +import { + BeforeInsert, + Column, + Entity, + JoinColumn, + JoinTable, + ManyToMany, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn +} from 'typeorm' +import User from 'src/users/entity/user.entity' +import Message from './message.entity' + +@Entity() +export default class Channel { + @PrimaryGeneratedColumn() + id: number + + @Column() + name: string + + @Column({ default: false }) + isPrivate: boolean + + @Column({ default: '' }) + password: string + + @ManyToMany(() => User) + @JoinTable() + users: User[] + + @OneToMany(() => Message, (message: Message) => message.channel, { cascade: true }) + messages: Message[] + + @ManyToOne(() => User) + @JoinColumn() + owner: User + + @ManyToMany(() => User) + @JoinTable() + admins: User[] + + @Column('text', { array: true, default: [] }) + banned: number[][] + + @Column('text', { array: true, default: [] }) + muted: number[][] + + @Column({ default: false }) + isDM: boolean +} diff --git a/back/src/chat/entity/connection.entity.ts b/back/src/chat/entity/connection.entity.ts new file mode 100644 index 0000000..cc28f7d --- /dev/null +++ b/back/src/chat/entity/connection.entity.ts @@ -0,0 +1,13 @@ +import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from 'typeorm' + +@Entity() +export default class ConnectedUser { + @Column() + user: number + + @Column() + channel: number + + @PrimaryColumn() + socket: string +} diff --git a/back/src/chat/entity/dm.entity.ts b/back/src/chat/entity/dm.entity.ts new file mode 100644 index 0000000..d1a344c --- /dev/null +++ b/back/src/chat/entity/dm.entity.ts @@ -0,0 +1,15 @@ +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm' +import Message from './message.entity' +import type User from 'src/users/entity/user.entity' + +@Entity() +export class Channel { + @PrimaryGeneratedColumn() + id: number + + @Column() + users: User[] + + @OneToMany(() => Message, (message) => message.channel) + messages: Message[] +} diff --git a/back/src/chat/entity/message.entity.ts b/back/src/chat/entity/message.entity.ts new file mode 100644 index 0000000..e87e315 --- /dev/null +++ b/back/src/chat/entity/message.entity.ts @@ -0,0 +1,31 @@ +import { + Column, + CreateDateColumn, + Entity, + JoinColumn, + JoinTable, + ManyToOne, + PrimaryGeneratedColumn +} from 'typeorm' +import User from 'src/users/entity/user.entity' +import Channel from './channel.entity' + +@Entity() +export default class Message { + @PrimaryGeneratedColumn() + id: number + + @Column() + text: string + + @ManyToOne(() => User) + @JoinColumn() + author: User + + @ManyToOne(() => Channel, (channel) => channel.messages, { onDelete: 'CASCADE' }) + @JoinTable() + channel: Channel + + @CreateDateColumn() + created_at: Date +} diff --git a/back/src/chat/message.service.ts b/back/src/chat/message.service.ts new file mode 100644 index 0000000..366b008 --- /dev/null +++ b/back/src/chat/message.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@nestjs/common' +import { InjectRepository } from '@nestjs/typeorm' +import { Repository } from 'typeorm' +import { ChatService } from './chat.service' +import { UsersService } from 'src/users/users.service' + +import { type CreateMessageDto } from './dto/create-message.dto' +import type User from 'src/users/entity/user.entity' +import type Channel from './entity/channel.entity' +import Message from './entity/message.entity' + +@Injectable() +export class MessageService { + constructor ( + @InjectRepository(Message) + private readonly MessageRepository: Repository, + private readonly channelService: ChatService, + private readonly usersService: UsersService + ) {} + + async createMessage (message: CreateMessageDto): Promise { + const msg = new Message() + msg.text = message.text + msg.channel = await this.channelService.getChannel(message.ChannelId) + msg.author = (await this.usersService.findUser(message.UserId)) as User + msg.author.socketKey = '' + return await this.MessageRepository.save(msg) + } + + async findMessagesInChannelForUser ( + channel: Channel, + user: User + ): Promise { + const blockeds = user.blocked.map((u) => +u.ftId) + const messages = await this.MessageRepository.createQueryBuilder('message') + .innerJoin('message.channel', 'channel') + .where('channel.id = :chanId', { chanId: channel.id }) + .leftJoinAndSelect('message.author', 'author') + .orderBy('message.created_at', 'ASC') + .getMany() + messages.forEach((msg) => { + msg.author.socketKey = '' + }) + return messages + } +} diff --git a/back/src/main.ts b/back/src/main.ts new file mode 100644 index 0000000..7e03f94 --- /dev/null +++ b/back/src/main.ts @@ -0,0 +1,49 @@ +import { Logger, ValidationPipe } from '@nestjs/common' +import { NestFactory } from '@nestjs/core' +import { AppModule } from './app.module' +import * as session from 'express-session' +import * as passport from 'passport' +import { type NestExpressApplication } from '@nestjs/platform-express' +import * as cookieParser from 'cookie-parser' +import { IoAdapter } from '@nestjs/platform-socket.io' + +async function bootstrap (): Promise { + const logger = new Logger() + const app = await NestFactory.create(AppModule) + const port = + process.env.BACK_PORT !== undefined && process.env.BACK_PORT !== '' + ? +process.env.BACK_PORT + : 3001 + const cors = { + origin: new RegExp( + `^(http|ws)://${process.env.HOST ?? 'localhost'}(:\\d+)?$` + ), + methods: 'GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS', + preflightContinue: false, + optionsSuccessStatus: 204, + credentials: true, + allowedHeaders: + ['Accept', 'Content-Type', 'Authorization'] + } + app.use( + session({ + resave: false, + saveUninitialized: false, + secret: + process.env.JWT_SECRET !== undefined && process.env.JWT_SECRET !== '' + ? process.env.JWT_SECRET + : 'secret' + }) + ) + app.use(cookieParser()) + app.use(passport.initialize()) + app.use(passport.session()) + app.enableCors(cors) + app.useWebSocketAdapter(new IoAdapter(app)) + app.useGlobalPipes(new ValidationPipe()) + await app.listen(port) + logger.log(`Application listening on port ${port}`) +} +bootstrap().catch((e) => { + console.log('Error!') +}) diff --git a/back/src/pong/dtos/GameCreationDtoValidated.ts b/back/src/pong/dtos/GameCreationDtoValidated.ts new file mode 100644 index 0000000..3b55da4 --- /dev/null +++ b/back/src/pong/dtos/GameCreationDtoValidated.ts @@ -0,0 +1,38 @@ +import { Type } from 'class-transformer' +import { + ArrayMaxSize, + ArrayMinSize, + IsNotEmptyObject, + IsNumber, + IsString, + Max, + Min, + ValidateNested +} from 'class-validator' +import { + DEFAULT_BALL_INITIAL_SPEED, + DEFAULT_MAX_BALL_SPEED +} from '../game/constants' +import { MapDtoValidated } from './MapDtoValidated' + +export class GameCreationDtoValidated { + @IsString({ each: true }) + @ArrayMaxSize(2) + @ArrayMinSize(2) + playerNames!: string[] + + @IsNotEmptyObject() + @ValidateNested() + @Type(() => MapDtoValidated) + map!: MapDtoValidated + + @IsNumber() + @Min(DEFAULT_BALL_INITIAL_SPEED.x) + @Max(DEFAULT_MAX_BALL_SPEED.x) + initialBallSpeedX!: number + + @IsNumber() + @Min(DEFAULT_BALL_INITIAL_SPEED.y) + @Max(DEFAULT_MAX_BALL_SPEED.y) + initialBallSpeedY!: number +} diff --git a/back/src/pong/dtos/GameInfo.ts b/back/src/pong/dtos/GameInfo.ts new file mode 100644 index 0000000..1a42151 --- /dev/null +++ b/back/src/pong/dtos/GameInfo.ts @@ -0,0 +1,13 @@ +import { type Point, type Rect } from '../game/utils' + +export class GameInfo { + mapSize!: Point + yourPaddleIndex!: number + gameId!: string + walls!: Rect[] + paddleSize!: Point + ballSize!: Point + winScore!: number + ranked!: boolean + playerNames!: string[] +} diff --git a/back/src/pong/dtos/GameUpdate.ts b/back/src/pong/dtos/GameUpdate.ts new file mode 100644 index 0000000..4804119 --- /dev/null +++ b/back/src/pong/dtos/GameUpdate.ts @@ -0,0 +1,8 @@ +import { type Point } from '../game/utils' + +export class GameUpdate { + paddlesPositions!: Point[] + ballSpeed!: Point + ballPosition!: Point + scores!: number[] +} diff --git a/back/src/pong/dtos/MapDtoValidated.ts b/back/src/pong/dtos/MapDtoValidated.ts new file mode 100644 index 0000000..716e883 --- /dev/null +++ b/back/src/pong/dtos/MapDtoValidated.ts @@ -0,0 +1,23 @@ +import { Type } from 'class-transformer' +import { + ArrayMaxSize, + IsArray, + IsDefined, + IsObject, + ValidateNested +} from 'class-validator' +import { PointDtoValidated } from './PointDtoValidated' +import { RectDtoValidated } from './RectDtoValidated' + +export class MapDtoValidated { + @IsObject() + @IsDefined() + @Type(() => PointDtoValidated) + size!: PointDtoValidated + + @IsArray() + @ArrayMaxSize(5) + @ValidateNested({ each: true }) + @Type(() => RectDtoValidated) + walls!: RectDtoValidated[] +} diff --git a/back/src/pong/dtos/MatchmakingDto.ts b/back/src/pong/dtos/MatchmakingDto.ts new file mode 100644 index 0000000..580c222 --- /dev/null +++ b/back/src/pong/dtos/MatchmakingDto.ts @@ -0,0 +1,3 @@ +export class MatchmakingDto { + matchmaking!: boolean +} diff --git a/back/src/pong/dtos/MatchmakingDtoValidated.ts b/back/src/pong/dtos/MatchmakingDtoValidated.ts new file mode 100644 index 0000000..d83286c --- /dev/null +++ b/back/src/pong/dtos/MatchmakingDtoValidated.ts @@ -0,0 +1,7 @@ +import { IsBoolean } from 'class-validator' +import { MatchmakingDto } from './MatchmakingDto' + +export class MatchmakingDtoValidated extends MatchmakingDto { + @IsBoolean() + matchmaking!: boolean +} diff --git a/back/src/pong/dtos/PointDtoValidated.ts b/back/src/pong/dtos/PointDtoValidated.ts new file mode 100644 index 0000000..8a8cbf6 --- /dev/null +++ b/back/src/pong/dtos/PointDtoValidated.ts @@ -0,0 +1,10 @@ +import { IsNumber } from 'class-validator' +import { Point } from '../game/utils' + +export class PointDtoValidated extends Point { + @IsNumber() + x!: number + + @IsNumber() + y!: number +} diff --git a/back/src/pong/dtos/RectDtoValidated.ts b/back/src/pong/dtos/RectDtoValidated.ts new file mode 100644 index 0000000..d24a682 --- /dev/null +++ b/back/src/pong/dtos/RectDtoValidated.ts @@ -0,0 +1,14 @@ +import { Type } from 'class-transformer' +import { ValidateNested } from 'class-validator' +import { Rect } from '../game/utils' +import { PointDtoValidated } from './PointDtoValidated' + +export class RectDtoValidated extends Rect { + @ValidateNested() + @Type(() => PointDtoValidated) + center!: PointDtoValidated + + @ValidateNested() + @Type(() => PointDtoValidated) + size!: PointDtoValidated +} diff --git a/back/src/pong/dtos/StringDto.ts b/back/src/pong/dtos/StringDto.ts new file mode 100644 index 0000000..62283b6 --- /dev/null +++ b/back/src/pong/dtos/StringDto.ts @@ -0,0 +1,3 @@ +export class StringDto { + value!: string +} diff --git a/back/src/pong/dtos/StringDtoValidated.ts b/back/src/pong/dtos/StringDtoValidated.ts new file mode 100644 index 0000000..0211e22 --- /dev/null +++ b/back/src/pong/dtos/StringDtoValidated.ts @@ -0,0 +1,7 @@ +import { IsString } from 'class-validator' +import { StringDto } from './StringDto' + +export class StringDtoValidated extends StringDto { + @IsString() + value!: string +} diff --git a/back/src/pong/dtos/UserDto.ts b/back/src/pong/dtos/UserDto.ts new file mode 100644 index 0000000..10880a7 --- /dev/null +++ b/back/src/pong/dtos/UserDto.ts @@ -0,0 +1,12 @@ +import { IsString } from 'class-validator' + +export class UserDto { + @IsString() + username!: string + + @IsString() + avatar!: string + + @IsString() + status!: string +} diff --git a/back/src/pong/entity/result.entity.ts b/back/src/pong/entity/result.entity.ts new file mode 100644 index 0000000..86c7a43 --- /dev/null +++ b/back/src/pong/entity/result.entity.ts @@ -0,0 +1,27 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToMany, + CreateDateColumn +} from 'typeorm' + +import User from 'src/users/entity/user.entity' + +@Entity() +export default class Result { + @PrimaryGeneratedColumn() + id: number + + @Column({ default: false }) + ranked: boolean + + @ManyToMany(() => User, (player: User) => player.results, { cascade: true }) + players: Array + + @Column('text', { array: true }) + public score: number[] + + @CreateDateColumn() + date: Date +} diff --git a/back/src/pong/game/Ball.ts b/back/src/pong/game/Ball.ts new file mode 100644 index 0000000..a93b330 --- /dev/null +++ b/back/src/pong/game/Ball.ts @@ -0,0 +1,114 @@ +import { type Paddle } from './Paddle' +import { type Point, Rect } from './utils' +import { type MapDtoValidated } from '../dtos/MapDtoValidated' +import { + DEFAULT_BALL_SIZE, + GAME_TICKS, + DEFAULT_BALL_SPEED_INCREMENT, + DEFAULT_MAX_BALL_SPEED +} from './constants' + +export class Ball { + rect: Rect + initial_speed: Point + speed: Point + spawn: Point + indexPlayerScored: number + timeoutTime: number + + constructor ( + spawn: Point, + initialSpeed: Point, + size: Point = DEFAULT_BALL_SIZE.clone() + ) { + this.rect = new Rect(spawn, size) + this.speed = initialSpeed.clone() + this.initial_speed = initialSpeed.clone() + this.spawn = spawn.clone() + this.indexPlayerScored = -1 + this.timeoutTime = 0 + } + + getIndexPlayerScored (): number { + return this.indexPlayerScored + } + + update (canvasRect: Rect, paddles: Paddle[], map: MapDtoValidated): void { + if (!canvasRect.contains_x(this.rect)) { + this.indexPlayerScored = this.playerScored() + this.timeoutTime = 2000 + } else { + this.indexPlayerScored = -1 + if (this.timeoutTime <= 0) { + this.move(canvasRect, paddles, map) + } else { + this.timeoutTime -= 1000 / GAME_TICKS + } + } + } + + move (canvasRect: Rect, paddles: Paddle[], map: MapDtoValidated): void { + for (const paddle of paddles) { + if (paddle.rect.collides(this.rect)) { + if (this.speed.x < 0) { + this.rect.center.x = paddle.rect.center.x + paddle.rect.size.x + } else this.rect.center.x = paddle.rect.center.x - paddle.rect.size.x + this.speed.x = this.speed.x * -1 + this.speed.y = + ((this.rect.center.y - paddle.rect.center.y) / paddle.rect.size.y) * + 20 + break + } + } + + for (const wall of map.walls) { + if (wall.collides(this.rect)) { + if (this.speed.x < 0) { + this.rect.center.x = wall.center.x + wall.size.x + } else this.rect.center.x = wall.center.x - wall.size.x + this.speed.x = this.speed.x * -1 + this.speed.y = + ((this.rect.center.y - wall.center.y) / wall.size.y) * 20 + break + } + } + + if (!canvasRect.contains_y(this.rect)) this.speed.y = this.speed.y * -1 + + if (this.speed.x > 0 && this.speed.x < DEFAULT_MAX_BALL_SPEED.x) { + this.speed.x += DEFAULT_BALL_SPEED_INCREMENT.x + } + if (this.speed.x < 0 && this.speed.x > -DEFAULT_MAX_BALL_SPEED.x) { + this.speed.x -= DEFAULT_BALL_SPEED_INCREMENT.x + } + if (this.speed.y > 0 && this.speed.y > DEFAULT_MAX_BALL_SPEED.y) { + this.speed.y += DEFAULT_MAX_BALL_SPEED.y + } + if (this.speed.y < 0 && this.speed.y < -DEFAULT_MAX_BALL_SPEED.y) { + this.speed.y -= DEFAULT_MAX_BALL_SPEED.y + } + this.rect.center.add_inplace(this.speed) + } + + playerScored (): number { + let indexPlayerScored: number + + if (this.rect.center.x <= this.spawn.x) { + indexPlayerScored = 1 + this.speed.x = this.initial_speed.x + } else { + indexPlayerScored = 0 + this.speed.x = -this.initial_speed.x + } + + if (this.speed.y < 0) { + this.speed.y = this.initial_speed.y + } else { + this.speed.y = -this.initial_speed.y + } + + this.rect.center = this.spawn.clone() + + return indexPlayerScored + } +} diff --git a/back/src/pong/game/Game.ts b/back/src/pong/game/Game.ts new file mode 100644 index 0000000..322713e --- /dev/null +++ b/back/src/pong/game/Game.ts @@ -0,0 +1,197 @@ +import { Ball } from './Ball' +import { type Socket } from 'socket.io' +import { Point, Rect } from './utils' +import { Player } from './Player' +import { + DEFAULT_BALL_INITIAL_SPEED, + DEFAULT_BALL_SIZE, + DEFAULT_PADDLE_SIZE, + DEFAULT_WIN_SCORE, + GAME_EVENTS, + GAME_TICKS +} from './constants' +import { randomUUID } from 'crypto' +import { type MapDtoValidated } from '../dtos/MapDtoValidated' +import { type GameUpdate } from '../dtos/GameUpdate' +import { type GameInfo } from '../dtos/GameInfo' +import { type PongService } from '../pong.service' + +export class Game { + id: string + timer: NodeJS.Timer | null + map: MapDtoValidated + ball: Ball + players: Player[] = [] + ranked: boolean + initialBallSpeed: Point + waitingForTimeout: boolean + gameStoppedCallback: (name: string) => void + + constructor ( + sockets: Socket[], + uuids: string[], + names: string[], + map: MapDtoValidated, + gameStoppedCallback: (name: string) => void, + private readonly pongService: PongService, + ranked: boolean, + initialBallSpeed: Point = DEFAULT_BALL_INITIAL_SPEED.clone() + ) { + this.id = randomUUID() + this.timer = null + this.ranked = ranked + this.waitingForTimeout = false + this.map = map + this.gameStoppedCallback = gameStoppedCallback + this.initialBallSpeed = initialBallSpeed + this.ball = new Ball( + new Point(this.map.size.x / 2, this.map.size.y / 2), + initialBallSpeed + ) + for (let i = 0; i < uuids.length; i++) { + this.addPlayer(sockets[i], uuids[i], names[i]) + } + } + + getGameInfo (name: string): GameInfo { + const yourPaddleIndex = this.players.findIndex((p) => p.name === name) + return { + mapSize: this.map.size, + yourPaddleIndex, + gameId: this.id, + walls: this.map.walls, + paddleSize: DEFAULT_PADDLE_SIZE, + ballSize: DEFAULT_BALL_SIZE, + winScore: DEFAULT_WIN_SCORE, + ranked: this.ranked, + playerNames: this.players.map((p) => p.name) + } + } + + private addPlayer (socket: Socket, uuid: string, name: string): void { + let paddleCoords = new Point( + DEFAULT_PADDLE_SIZE.x / 2, + this.map.size.y / 2 + ) + if (this.players.length === 1) { + paddleCoords = new Point( + this.map.size.x - DEFAULT_PADDLE_SIZE.x / 2, + this.map.size.y / 2 + ) + } + this.players.push( + new Player(socket, uuid, name, paddleCoords, this.map.size) + ) + if (this.ranked) { + this.ready(name) + } + } + + ready (name: string): void { + const playerIndex: number = this.players.findIndex((p) => p.name === name) + if (playerIndex !== -1 && !this.players[playerIndex].ready) { + this.players[playerIndex].ready = true + console.log(`${this.players[playerIndex].name} is ready`) + if (this.players.length === 2 && this.players.every((p) => p.ready)) { + this.start() + } + } + } + + private start (): void { + if (this.timer === null && this.players.length === 2) { + this.ball = new Ball( + new Point(this.map.size.x / 2, this.map.size.y / 2), + this.initialBallSpeed + ) + this.players.forEach((p) => { + void this.pongService.setInGame(p.name) + p.newGame() + }) + this.broadcastGame(GAME_EVENTS.START_GAME) + this.timer = setInterval(this.gameLoop.bind(this), 1000 / GAME_TICKS) + console.log(`Game ${this.id} starting in 3 seconds`) + this.waitingForTimeout = true + new Promise((resolve) => setTimeout(resolve, 3000)) + .then(() => (this.waitingForTimeout = false)) + .catch(() => {}) + } + } + + stop (nameWhoLeft?: string): void { + if (this.timer !== null) { + clearInterval(this.timer) + } + let nameWhoWon: string + if (this.players[0].score > this.players[1].score) { + nameWhoWon = this.players[0].name + } else { + nameWhoWon = this.players[1].name + } + if (nameWhoLeft !== undefined) { + this.players.forEach((p) => { + if (p.name !== nameWhoLeft) { + nameWhoWon = p.name + } + }) + } + this.timer = null + this.pongService + .saveResult(this.players, this.ranked, nameWhoWon) + .then(() => { + this.gameStoppedCallback(this.players[0].name) + this.players = [] + }) + .catch(() => { + this.gameStoppedCallback(this.players[0].name) + this.players = [] + }) + } + + movePaddle (name: string | undefined, position: Point): void { + const playerIndex: number = this.players.findIndex((p) => p.name === name) + + if (this.timer !== null && playerIndex !== -1) { + this.players[playerIndex].paddle.move(position.y) + } + } + + private broadcastGame (event: string, data?: any): void { + this.players.forEach((p) => { + p.socket.emit(event, data) + }) + } + + private gameLoop (): void { + if (this.waitingForTimeout) { + return + } + + const canvasRect: Rect = new Rect( + new Point(this.map.size.x / 2, this.map.size.y / 2), + new Point(this.map.size.x, this.map.size.y) + ) + + this.ball.update( + canvasRect, + this.players.map((p) => p.paddle), + this.map + ) + const indexPlayerScored: number = this.ball.getIndexPlayerScored() + if (indexPlayerScored !== -1) { + this.players[indexPlayerScored].score += 1 + if (this.players[indexPlayerScored].score >= DEFAULT_WIN_SCORE) { + console.log(`${this.players[indexPlayerScored].name} won`) + this.stop() + } + } + + const data: GameUpdate = { + paddlesPositions: this.players.map((p) => p.paddle.rect.center), + ballSpeed: this.ball.speed, + ballPosition: this.ball.rect.center, + scores: this.players.map((p) => p.score) + } + this.broadcastGame(GAME_EVENTS.GAME_TICK, data) + } +} diff --git a/back/src/pong/game/Games.ts b/back/src/pong/game/Games.ts new file mode 100644 index 0000000..d1feca6 --- /dev/null +++ b/back/src/pong/game/Games.ts @@ -0,0 +1,119 @@ +import { type Socket } from 'socket.io' +import { Game } from './Game' +import { Point } from './utils' +import { type MapDtoValidated as GameMap } from '../dtos/MapDtoValidated' +import { type GameCreationDtoValidated } from '../dtos/GameCreationDtoValidated' +import { type GameInfo } from '../dtos/GameInfo' +import { type PongService } from '../pong.service' +import { + DEFAULT_BALL_SIZE, + DEFAULT_MAP_SIZE, + DEFAULT_PADDLE_SIZE, + DEFAULT_WIN_SCORE +} from './constants' + +export class Games { + constructor (private readonly pongService: PongService) {} + private readonly playerNameToGameIndex = new Map() + private readonly games = new Array() + + newGame ( + sockets: Socket[], + uuids: string[], + gameCreationDto: GameCreationDtoValidated, + ranked: boolean + ): void { + const names: string[] = gameCreationDto.playerNames + const map: GameMap = { + size: DEFAULT_MAP_SIZE, + walls: gameCreationDto.map.walls + } + if (!this.isInAGame(names[0]) && !this.isInAGame(names[1])) { + this.games.push( + new Game( + sockets, + uuids, + names, + map, + this.deleteGame.bind(this, names[0]), + this.pongService, + ranked, + new Point( + gameCreationDto.initialBallSpeedX, + gameCreationDto.initialBallSpeedY + ) + ) + ) + this.playerNameToGameIndex.set(names[0], this.games.length - 1) + this.playerNameToGameIndex.set(names[1], this.games.length - 1) + console.log( + `Created game ${names[0]} vs ${names[1]} (${ + this.games[this.games.length - 1].id + })` + ) + } + } + + ready (name: string): void { + const game: Game | undefined = this.playerGame(name) + if (game !== undefined) { + game.ready(name) + } + } + + private deleteGame (name: string): void { + const game: Game | undefined = this.playerGame(name) + if (game !== undefined) { + this.games.splice(this.games.indexOf(game), 1) + game.players.forEach((player) => { + this.playerNameToGameIndex.delete(player.name) + }) + console.log(`Game stopped: ${game.id}`) + } + } + + getGameInfo (name: string): GameInfo { + const game: Game | undefined = this.playerGame(name) + if (game !== undefined) { + return game.getGameInfo(name) + } + return { + yourPaddleIndex: -2, + gameId: '', + mapSize: new Point(0, 0), + walls: [], + paddleSize: DEFAULT_PADDLE_SIZE, + ballSize: DEFAULT_BALL_SIZE, + winScore: DEFAULT_WIN_SCORE, + ranked: false, + playerNames: [] + } + } + + movePlayer (name: string | undefined, position: Point): void { + const game: Game | undefined = this.playerGame(name) + if (game !== undefined) { + game.movePaddle(name, position) + } + } + + isInAGame (name: string | undefined): boolean { + if (name === undefined) return false + return this.playerNameToGameIndex.get(name) !== undefined + } + + playerGame (name: string | undefined): Game | undefined { + const game: Game | undefined = this.games.find((game) => + game.players.some((player) => player.name === name) + ) + return game + } + + async leaveGame (name: string): Promise { + const game: Game | undefined = this.playerGame(name) + if (game !== undefined && !game.ranked) { + game.stop() + this.deleteGame(name) + } + } +} diff --git a/back/src/pong/game/MatchmakingQueue.ts b/back/src/pong/game/MatchmakingQueue.ts new file mode 100644 index 0000000..a475dc6 --- /dev/null +++ b/back/src/pong/game/MatchmakingQueue.ts @@ -0,0 +1,64 @@ +import { type Socket } from 'socket.io' +import { type GameCreationDtoValidated } from '../dtos/GameCreationDtoValidated' +import { DEFAULT_BALL_INITIAL_SPEED, DEFAULT_MAP_SIZE } from './constants' +import { type Games } from './Games' + +export class MatchmakingQueue { + games: Games + queue: Array<{ name: string, socket: Socket, uuid: string }> + + constructor (games: Games) { + this.games = games + this.queue = [] + } + + addPlayer (name: string, socket: Socket, uuid: string): void { + if (!this.isInQueue(name)) { + console.log('Adding player to queue: ', name) + this.queue.push({ name, socket, uuid }) + if (this.canCreateGame()) { + this.createGame() + } + } + } + + removePlayer (name: string): void { + if (this.isInQueue(name)) { + console.log('Removing player from queue: ', name) + this.queue = this.queue.filter((player) => player.name !== name) + } + } + + isInQueue (name: string): boolean { + return this.queue.some((player) => player.name === name) + } + + canCreateGame (): boolean { + return this.queue.length >= 2 + } + + createGame (): void { + const player1 = this.queue.shift() + const player2 = this.queue.shift() + if (player1 === undefined || player2 === undefined) { + return + } + const gameCreationDto: GameCreationDtoValidated = { + playerNames: [player1.name, player2.name], + map: { + size: DEFAULT_MAP_SIZE, + walls: [] + }, + initialBallSpeedX: DEFAULT_BALL_INITIAL_SPEED.x, + initialBallSpeedY: DEFAULT_BALL_INITIAL_SPEED.y + } + const ranked = true + + this.games.newGame( + [player1.socket, player2.socket], + [player1.uuid, player2.uuid], + gameCreationDto, + ranked + ) + } +} diff --git a/back/src/pong/game/Paddle.ts b/back/src/pong/game/Paddle.ts new file mode 100644 index 0000000..324a819 --- /dev/null +++ b/back/src/pong/game/Paddle.ts @@ -0,0 +1,32 @@ +import { DEFAULT_PADDLE_SIZE } from './constants' +import { type Point, Rect } from './utils' + +export class Paddle { + rect: Rect + color: string | CanvasGradient | CanvasPattern = 'white' + mapSize: Point + + constructor ( + spawn: Point, + gameSize: Point, + size: Point = DEFAULT_PADDLE_SIZE + ) { + this.rect = new Rect(spawn, size) + this.mapSize = gameSize + } + + draw (context: CanvasRenderingContext2D): void { + this.rect.draw(context, this.color) + } + + move (newY: number): void { + const offset: number = this.rect.size.y / 2 + if (newY - offset < 0) { + this.rect.center.y = offset + } else if (newY + offset > this.mapSize.y) { + this.rect.center.y = this.mapSize.y - offset + } else { + this.rect.center.y = newY + } + } +} diff --git a/back/src/pong/game/Player.ts b/back/src/pong/game/Player.ts new file mode 100644 index 0000000..ee9b6da --- /dev/null +++ b/back/src/pong/game/Player.ts @@ -0,0 +1,36 @@ +import { type Socket } from 'socket.io' +import { Paddle } from './Paddle' +import { type Point } from './utils' + +export class Player { + socket: Socket + uuid: string + name: string + ready: boolean + paddle: Paddle + paddleCoords: Point + mapSize: Point + score: number + + constructor ( + socket: Socket, + uuid: string, + name: string, + paddleCoords: Point, + mapSize: Point + ) { + this.socket = socket + this.uuid = uuid + this.name = name + this.ready = false + this.paddle = new Paddle(paddleCoords, mapSize) + this.paddleCoords = paddleCoords + this.mapSize = mapSize + this.score = 0 + } + + newGame (): void { + this.score = 0 + this.paddle = new Paddle(this.paddleCoords, this.mapSize) + } +} diff --git a/back/src/pong/game/constants.ts b/back/src/pong/game/constants.ts new file mode 100644 index 0000000..49eafb2 --- /dev/null +++ b/back/src/pong/game/constants.ts @@ -0,0 +1,22 @@ +import { Point } from './utils' + +export const GAME_EVENTS = { + START_GAME: 'START_GAME', + READY: 'READY', + GAME_TICK: 'GAME_TICK', + PLAYER_MOVE: 'PLAYER_MOVE', + GET_GAME_INFO: 'GET_GAME_INFO', + CREATE_GAME: 'CREATE_GAME', + REGISTER_PLAYER: 'REGISTER_PLAYER', + MATCHMAKING: 'MATCHMAKING', + LEAVE_GAME: 'LEAVE_GAME' +} + +export const DEFAULT_MAP_SIZE = new Point(500, 400) +export const DEFAULT_PADDLE_SIZE = new Point(30, 50) +export const DEFAULT_BALL_SIZE = new Point(10, 10) +export const DEFAULT_BALL_INITIAL_SPEED = new Point(10, 2) +export const DEFAULT_MAX_BALL_SPEED = new Point(20, 20) +export const DEFAULT_BALL_SPEED_INCREMENT = new Point(0.05, 0) +export const DEFAULT_WIN_SCORE = 5 +export const GAME_TICKS = 30 diff --git a/back/src/pong/game/utils.ts b/back/src/pong/game/utils.ts new file mode 100644 index 0000000..d26ea43 --- /dev/null +++ b/back/src/pong/game/utils.ts @@ -0,0 +1,92 @@ +export class Point { + x: number + y: number + + constructor (x: number, y: number) { + this.x = x + this.y = y + } + + // Returns a new point + add (other: Point): Point { + return new Point(this.x + other.x, this.y + other.y) + } + + // Modifies `this` point + add_inplace (other: Point): void { + this.x += other.x + this.y += other.y + } + + clone (): Point { + return new Point(this.x, this.y) + } +} + +export class Rect { + center: Point + size: Point + + constructor (center: Point, size: Point) { + this.center = center + this.size = size + } + + draw ( + context: CanvasRenderingContext2D, + color: string | CanvasGradient | CanvasPattern + ): void { + const offset: Point = new Point(this.size.x / 2, this.size.y / 2) + + context.fillStyle = color + context.fillRect( + this.center.x - offset.x, + this.center.y - offset.y, + this.size.x, + this.size.y + ) + } + + // True if `this` rect contains `other` rect in the x-axis + contains_x (other: Rect): boolean { + const offset: number = this.size.x / 2 + const offsetOther: number = other.size.x / 2 + + if ( + this.center.x - offset <= other.center.x - offsetOther && + this.center.x + offset >= other.center.x + offsetOther + ) { + return true + } + return false + } + + // True if `this` rect contains `other` rect in the y-axis + contains_y (other: Rect): boolean { + const offset: number = this.size.y / 2 + const offsetOther: number = other.size.y / 2 + + if ( + this.center.y - offset <= other.center.y - offsetOther && + this.center.y + offset >= other.center.y + offsetOther + ) { + return true + } + return false + } + + collides (other: Rect): boolean { + const offset: Point = new Point(this.size.x / 2, this.size.y / 2) + const offsetOther: Point = new Point(other.size.x / 2, other.size.y / 2) + + if ( + this.center.x - offset.x < other.center.x + offsetOther.x && + this.center.x + offset.x > other.center.x - offsetOther.x && + this.center.y - offset.y < other.center.y + offsetOther.y && + this.center.y + offset.y > other.center.y - offsetOther.y + ) { + return true + } + return false + } +} diff --git a/back/src/pong/pong.controller.ts b/back/src/pong/pong.controller.ts new file mode 100644 index 0000000..809880d --- /dev/null +++ b/back/src/pong/pong.controller.ts @@ -0,0 +1,33 @@ +import { + Controller, + Get, + Param, + ParseIntPipe, + UseGuards +} from '@nestjs/common' +import { Paginate, type Paginated, PaginateQuery } from 'nestjs-paginate' +import { AuthenticatedGuard } from 'src/auth/42-auth.guard' +import type Result from './entity/result.entity' +import { PongService } from './pong.service' + +@Controller('results') +export class PongController { + constructor (private readonly pongService: PongService) {} + + @Get('global') + @UseGuards(AuthenticatedGuard) + async getGlobalHistory ( + @Paginate() query: PaginateQuery + ): Promise> { + return await this.pongService.getHistory(query, 0) + } + + @Get(':id') + @UseGuards(AuthenticatedGuard) + async getHistoryById ( + @Param('id', ParseIntPipe) id: number, + @Paginate() query: PaginateQuery + ): Promise> { + return await this.pongService.getHistory(query, id) + } +} diff --git a/back/src/pong/pong.gateway.ts b/back/src/pong/pong.gateway.ts new file mode 100644 index 0000000..34b35ca --- /dev/null +++ b/back/src/pong/pong.gateway.ts @@ -0,0 +1,239 @@ +import { UsePipes, ValidationPipe } from '@nestjs/common' +import { Socket } from 'socket.io' +import { + ConnectedSocket, + MessageBody, + type OnGatewayConnection, + type OnGatewayDisconnect, + SubscribeMessage, + WebSocketGateway +} from '@nestjs/websockets' + +import { Games } from './game/Games' +import { GAME_EVENTS } from './game/constants' +import { GameCreationDtoValidated } from './dtos/GameCreationDtoValidated' +import { type Game } from './game/Game' +import { plainToClass } from 'class-transformer' +import { PointDtoValidated } from './dtos/PointDtoValidated' +import { StringDtoValidated } from './dtos/StringDtoValidated' +import { MatchmakingQueue } from './game/MatchmakingQueue' +import { MatchmakingDtoValidated } from './dtos/MatchmakingDtoValidated' +import { PongService } from './pong.service' +import { UsersService } from 'src/users/users.service' +import type User from 'src/users/entity/user.entity' + +@WebSocketGateway({ + cors: { origin: new RegExp(`^(http|ws)://${process.env.HOST ?? 'localhost'}(:\\d+)?$`) } +}) +export class PongGateway implements OnGatewayConnection, OnGatewayDisconnect { + constructor ( + private readonly pongService: PongService, + private readonly usersService: UsersService + ) {} + + private readonly games: Games = new Games(this.pongService) + private readonly socketToPlayerName = new Map() + private readonly matchmakingQueue = new MatchmakingQueue(this.games) + + playerIsRegistered (name: string): boolean { + return Array.from(this.socketToPlayerName.values()).includes(name) + } + + handleConnection (): void {} + + handleDisconnect ( + @ConnectedSocket() + client: Socket + ): void { + const name: string | undefined = this.socketToPlayerName.get(client) + const game: Game | undefined = this.games.playerGame(name) + if (name !== undefined) { + if (game !== undefined) { + game.stop(name) + } + console.log('Disconnected ', this.socketToPlayerName.get(client)) + this.matchmakingQueue.removePlayer(name) + this.socketToPlayerName.delete(client) + } + } + + @UsePipes(new ValidationPipe({ whitelist: true })) + @SubscribeMessage(GAME_EVENTS.REGISTER_PLAYER) + async registerPlayer ( + @ConnectedSocket() + client: Socket, + @MessageBody('playerName') playerName: StringDtoValidated, + @MessageBody('socketKey') socketKey: StringDtoValidated + ): Promise<{ event: string, data: boolean }> { + let succeeded: boolean = false + let user: User | null = null + try { + user = await this.usersService.findUserByName(playerName.value) + } catch (e) { + console.log('Failed to register player', playerName.value) + } + + // Check that socket key is not already registered + for (const [socket, name] of this.socketToPlayerName) { + try { + const _user: User = await this.usersService.findUserByName(name) + if (_user.socketKey === socketKey.value) { + console.log('Failed to register player', playerName.value, '(socket key already registered)') + } + } catch (e) { + // User does not exist anymore, unregister it + console.log('Disconnected player', name) + this.socketToPlayerName.delete(socket) + const game: Game | undefined = this.games.playerGame(name) + if (game !== undefined) { + game.stop(name) + } + this.matchmakingQueue.removePlayer(name) + this.socketToPlayerName.delete(client) + } + } + + if ( + user !== null && + user.socketKey === socketKey.value && + !this.playerIsRegistered(playerName.value) + ) { + this.socketToPlayerName.set(client, playerName.value) + succeeded = true + console.log('Registered player', playerName.value) + } else { + console.log('Failed to register player', playerName.value) + } + return { event: GAME_EVENTS.REGISTER_PLAYER, data: succeeded } + } + + @SubscribeMessage(GAME_EVENTS.GET_GAME_INFO) + getPlayerCount (@ConnectedSocket() client: Socket): void { + const name: string | undefined = this.socketToPlayerName.get(client) + if (name !== undefined) { + client.emit(GAME_EVENTS.GET_GAME_INFO, this.games.getGameInfo(name)) + } + } + + @UsePipes(new ValidationPipe({ whitelist: true })) + @SubscribeMessage(GAME_EVENTS.PLAYER_MOVE) + movePlayer ( + @ConnectedSocket() + client: Socket, + @MessageBody() position: PointDtoValidated + ): void { + const realPosition: PointDtoValidated = plainToClass( + PointDtoValidated, + position + ) + const name: string | undefined = this.socketToPlayerName.get(client) + this.games.movePlayer(name, realPosition) + } + + @UsePipes(new ValidationPipe({ whitelist: true })) + @SubscribeMessage(GAME_EVENTS.CREATE_GAME) + createGame ( + @ConnectedSocket() + client: Socket, + @MessageBody() gameCreationDto: GameCreationDtoValidated + ): { event: string, data: boolean } { + const realGameCreationDto: GameCreationDtoValidated = plainToClass( + GameCreationDtoValidated, + gameCreationDto + ) + + if (this.socketToPlayerName.size >= 2) { + const player1Socket: Socket | undefined = Array.from( + this.socketToPlayerName.keys() + ).find( + (key) => + this.socketToPlayerName.get(key) === + realGameCreationDto.playerNames[0] + ) + const player1game: Game | undefined = this.games.playerGame( + realGameCreationDto.playerNames[0] + ) + const player2Socket: Socket | undefined = Array.from( + this.socketToPlayerName.keys() + ).find( + (key) => + this.socketToPlayerName.get(key) === + realGameCreationDto.playerNames[1] + ) + const player2game: Game | undefined = this.games.playerGame( + realGameCreationDto.playerNames[1] + ) + + if ( + player1Socket !== undefined && + player2Socket !== undefined && + player1game === undefined && + player2game === undefined && + (client.id === player1Socket.id || client.id === player2Socket.id) && + player1Socket.id !== player2Socket.id + ) { + this.matchmakingQueue.removePlayer(realGameCreationDto.playerNames[0]) + this.matchmakingQueue.removePlayer(realGameCreationDto.playerNames[1]) + + const ranked = false + this.games.newGame( + [player1Socket, player2Socket], + [player1Socket.id, player2Socket.id], + realGameCreationDto, + ranked + ) + return { event: GAME_EVENTS.CREATE_GAME, data: true } + } + } + return { event: GAME_EVENTS.CREATE_GAME, data: false } + } + + @SubscribeMessage(GAME_EVENTS.READY) + ready ( + @ConnectedSocket() + client: Socket + ): { event: string, data: boolean } { + let succeeded: boolean = false + const name: string | undefined = this.socketToPlayerName.get(client) + if (name !== undefined) { + this.games.ready(name) + succeeded = true + } + return { event: GAME_EVENTS.READY, data: succeeded } + } + + @UsePipes(new ValidationPipe({ whitelist: true })) + @SubscribeMessage(GAME_EVENTS.MATCHMAKING) + updateMatchmaking ( + @ConnectedSocket() + client: Socket, + @MessageBody() matchmakingUpdateData: MatchmakingDtoValidated + ): { event: string, data: MatchmakingDtoValidated } { + let matchmaking: boolean = false + const name: string | undefined = this.socketToPlayerName.get(client) + if (name !== undefined) { + if (matchmakingUpdateData.matchmaking && !this.games.isInAGame(name)) { + this.matchmakingQueue.addPlayer(name, client, client.id) + } else { + this.matchmakingQueue.removePlayer(name) + } + matchmaking = this.matchmakingQueue.isInQueue(name) + } + return { + event: GAME_EVENTS.MATCHMAKING, + data: { matchmaking } + } + } + + @UsePipes(new ValidationPipe({ whitelist: true })) + @SubscribeMessage(GAME_EVENTS.LEAVE_GAME) + leaveGame ( + @ConnectedSocket() + client: Socket + ): void { + const name: string | undefined = this.socketToPlayerName.get(client) + if (name !== undefined) { + void this.games.leaveGame(name) + } + } +} diff --git a/back/src/pong/pong.module.ts b/back/src/pong/pong.module.ts new file mode 100644 index 0000000..df862a7 --- /dev/null +++ b/back/src/pong/pong.module.ts @@ -0,0 +1,15 @@ +import { forwardRef, Module } from '@nestjs/common' +import { PongGateway } from './pong.gateway' +import Result from './entity/result.entity' +import { TypeOrmModule } from '@nestjs/typeorm' +import { PongService } from './pong.service' +import { UsersModule } from 'src/users/users.module' +import { PongController } from './pong.controller' + +@Module({ + imports: [forwardRef(() => UsersModule), TypeOrmModule.forFeature([Result])], + providers: [PongGateway, PongService], + controllers: [PongController], + exports: [PongService] +}) +export class PongModule {} diff --git a/back/src/pong/pong.service.ts b/back/src/pong/pong.service.ts new file mode 100644 index 0000000..c9cf792 --- /dev/null +++ b/back/src/pong/pong.service.ts @@ -0,0 +1,88 @@ +import { Injectable } from '@nestjs/common' +import { InjectRepository } from '@nestjs/typeorm' +import { Repository } from 'typeorm' +import { UsersService } from 'src/users/users.service' +import Result from './entity/result.entity' +import type User from 'src/users/entity/user.entity' +import { type Player } from './game/Player' +import { type PaginateQuery, paginate, type Paginated } from 'nestjs-paginate' + +@Injectable() +export class PongService { + constructor ( + @InjectRepository(Result) + private readonly resultsRepository: Repository, + private readonly usersService: UsersService + ) {} + + async updateStats ( + player: User, + nameWhoWon: string + ): Promise { + player.matchs++ + if (player.username === nameWhoWon) player.wins++ + else player.looses++ + player.winrate = (100 * player.wins) / player.matchs + } + + async updatePlayer ( + i: number, + result: Result, + nameWhoWon: string + ): Promise { + const player: User | null = result.players[i] + if (player == null) return + if (result.ranked) await this.updateStats(player, nameWhoWon) + player.results.push(result) + player.status = 'online' + await this.usersService.save(player) + } + + async setInGame (playerName: string): Promise { + const player = await this.usersService.findUserByName(playerName) + player.status = 'in-game' + await this.usersService.save(player) + } + + async saveResult ( + players: Player[], + ranked: boolean, + nameWhoWon: string + ): Promise { + const result = new Result() + const ply = new Array() + ply.push(await this.usersService.findUserByName(players[0].name)) + ply.push(await this.usersService.findUserByName(players[1].name)) + result.ranked = ranked + result.players = ply + result.score = [players[0].score, players[1].score] + await this.resultsRepository.save(result) + await this.updatePlayer(0, result, nameWhoWon) + await this.updatePlayer(1, result, nameWhoWon) + await this.usersService.getLeaderboard() + } + + async getHistory ( + query: PaginateQuery, + ftId: number + ): Promise> { + let queryBuilder + if (ftId !== 0) { + queryBuilder = this.resultsRepository + .createQueryBuilder('result') + .innerJoin('result.players', 'player', 'player.ftId = :ftId', { ftId }) + } else { + queryBuilder = this.resultsRepository + .createQueryBuilder('result') + .where('result.ranked = :ranked', { ranked: true }) + } + + return await paginate(query, queryBuilder, { + nullSort: 'last', + relations: ['players'], + defaultSortBy: [['date', 'DESC']], + sortableColumns: ['date'], + maxLimit: 10 + }) + } +} diff --git a/back/src/types.d.ts b/back/src/types.d.ts new file mode 100644 index 0000000..48e3dde --- /dev/null +++ b/back/src/types.d.ts @@ -0,0 +1,8 @@ +declare module 'passport-42' { + export type Profile = any + export type VerifyCallback = any + export class Strategy { + constructor (options: any, verify: any) + authenticate (req: any, options: any): any + } +} diff --git a/back/src/users/dto/user.dto.ts b/back/src/users/dto/user.dto.ts new file mode 100644 index 0000000..b450afb --- /dev/null +++ b/back/src/users/dto/user.dto.ts @@ -0,0 +1,37 @@ +import { IsNotEmpty, IsPositive, IsOptional, IsEmail, NotContains, MaxLength, IsAlphanumeric } from 'class-validator' + +import { ApiProperty } from '@nestjs/swagger' +import { Express } from 'express' + +export class UserDto { + @IsPositive() + @IsOptional() + readonly ftId: number + + @IsNotEmpty() + @NotContains(' ') + @IsAlphanumeric() + @MaxLength(15) + readonly username: string + + @IsEmail() + @IsNotEmpty() + readonly email: string + + @IsOptional() + readonly status: string + + @IsOptional() + readonly avatar: string + + @IsOptional() + readonly authToken: string + + @IsOptional() + readonly isVerified: boolean +} + +export class AvatarUploadDto { + @ApiProperty({ type: 'string', format: 'binary' }) + file: Express.Multer.File +} diff --git a/back/src/users/entity/user.entity.ts b/back/src/users/entity/user.entity.ts new file mode 100644 index 0000000..f2148bd --- /dev/null +++ b/back/src/users/entity/user.entity.ts @@ -0,0 +1,78 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToMany, + JoinTable +} from 'typeorm' + +import Result from 'src/pong/entity/result.entity' + +@Entity() +export class User { + @PrimaryGeneratedColumn() + id: number + + @Column({ type: 'bigint', default: Date.now() }) + lastAccess: number + + @Column({ unique: true }) + ftId: number + + @Column({ nullable: true }) + email: string + + @Column({ select: false, nullable: true }) + authToken: string + + @Column({ default: false }) + twoFA: boolean + + @Column({ default: false, nullable: true }) + isVerified: boolean + + @Column('uuid', { nullable: true, unique: true }) + socketKey: string + + @Column({ unique: true }) + username: string + + @Column({ default: 'online' }) + status: string + + @Column({ name: 'avatar' }) + avatar: string + + @Column({ default: 0 }) + wins: number + + @Column({ default: 0 }) + looses: number + + @Column({ default: 0 }) + matchs: number + + @Column({ default: 0 }) + rank: number + + @Column({ default: 0, type: 'double precision' }) + winrate: number + + @ManyToMany(() => Result, (result: Result) => result.players) + @JoinTable() + results: Result[] + + @ManyToMany(() => User) + @JoinTable() + blocked: User[] + + @ManyToMany(() => User) + @JoinTable() + followers: User[] + + @ManyToMany(() => User) + @JoinTable() + friends: User[] +} + +export default User diff --git a/back/src/users/users.controller.ts b/back/src/users/users.controller.ts new file mode 100644 index 0000000..87ec09b --- /dev/null +++ b/back/src/users/users.controller.ts @@ -0,0 +1,222 @@ +import { + Controller, + Get, + Post, + Body, + Param, + ParseIntPipe, + UploadedFile, + UseGuards, + UseInterceptors, + Res, + StreamableFile, + BadRequestException, + Redirect, + Delete +} from '@nestjs/common' + +import { FileInterceptor } from '@nestjs/platform-express' +import { diskStorage } from 'multer' + +import { type User } from './entity/user.entity' +import { UsersService } from './users.service' +import { UserDto, AvatarUploadDto } from './dto/user.dto' + +import { AuthenticatedGuard } from 'src/auth/42-auth.guard' +import { Profile42 } from 'src/auth/42.decorator' +import { Profile } from 'passport-42' + +import { ApiBody, ApiConsumes } from '@nestjs/swagger' +import { type Request, Response } from 'express' +import { createReadStream } from 'fs' +import { join } from 'path' + +@Controller('users') +export class UsersController { + constructor (private readonly usersService: UsersService) {} + + @Get('blocked') + @UseGuards(AuthenticatedGuard) + async getBlockedUsers (@Profile42() profile: Profile): Promise { + const user = await this.usersService.getFullUser(+profile.id) + if (user === null) throw new BadRequestException('User not found') + user.socketKey = '' + return user.blocked + } + + @Get('block/:id') + @UseGuards(AuthenticatedGuard) + async blockUser ( + @Profile42() profile: Profile, + @Param('id', ParseIntPipe) id: number + ): Promise { + const user = await this.usersService.getFullUser(+profile.id) + const target = await this.usersService.findUser(id) + if (user === null || target === null) { + throw new BadRequestException('User not found') + } + if (user.ftId === id) throw new BadRequestException('Cannot block yourself') + user.blocked.push(target) + console.log('user', JSON.stringify(user)) + console.log('user', JSON.stringify(target)) + await this.usersService.save(user) + } + + @Delete('block/:id') + @UseGuards(AuthenticatedGuard) + async unblockUser ( + @Profile42() profile: Profile, + @Param('id', ParseIntPipe) id: number + ): Promise { + const user = await this.usersService.getFullUser(+profile.id) + if (user === null) throw new BadRequestException('User not found') + const lenBefore = user.blocked.length + user.blocked = user.blocked.filter((usr: User) => { + return usr.ftId !== id + }) + if (lenBefore === user.blocked.length) throw new BadRequestException('User not blocked') + await this.usersService.save(user) + } + + @Get('all') + async getAllUsers (): Promise { + return await this.usersService.findUsers() + } + + @Get('online') + async getOnlineUsers (): Promise { + return await this.usersService.findOnlineUsers() + } + + @Get('friends') + @UseGuards(AuthenticatedGuard) + async getFriends (@Profile42() profile: Profile): Promise { + return await this.usersService.getFriends(+profile.id) + } + + @Get('invits') + @UseGuards(AuthenticatedGuard) + async getInvits (@Profile42() profile: Profile): Promise { + return await this.usersService.getInvits(+profile.id) + } + + @Get('leaderboard') + @UseGuards(AuthenticatedGuard) + async getLeaderboard (): Promise { + return await this.usersService.getLeaderboard() + } + + @Post('avatar') + @UseGuards(AuthenticatedGuard) + @Redirect(`http://${process.env.HOST ?? 'localhost'}`) + @UseInterceptors( + FileInterceptor('avatar', { + storage: diskStorage({ + destination: 'avatars/' + }), + fileFilter: (request: Request, file: Express.Multer.File, callback) => { + if (!file.mimetype.includes('image')) { + callback(null, false) + return + } + callback(null, true) + } + }) + ) + @ApiConsumes('multipart/form-data') + @ApiBody({ + description: 'A new avatar for the user', + type: AvatarUploadDto + }) + async changeAvatar ( + @Profile42() profile: Profile, + @UploadedFile() file: Express.Multer.File + ): Promise { + if (file === undefined) return + await this.usersService.addAvatar(+profile.id, file.filename) + } + + @Get('avatar') + @UseGuards(AuthenticatedGuard) + async getAvatar ( + @Profile42() profile: Profile, + @Res({ passthrough: true }) response: Response + ): Promise { + return await this.getAvatarById(+profile.id, response) + } + + @Get(':name/byname') + async getUserByName (@Param('name') username: string): Promise { + const user = await this.usersService.findUserByName(username) + user.socketKey = '' + return user + } + + @Get('invit/:username') + @UseGuards(AuthenticatedGuard) + async invitUser ( + @Profile42() profile: Profile, + @Param('username') username: string + ): Promise { + const target: User | null = await this.usersService.findUserByName( + username + ) + if (target === null) { + throw new BadRequestException(`User ${username} not found.`) + } + if (+profile.id === +target.ftId) { + throw new BadRequestException("You can't invite yourself.") + } + const ret: string = await this.usersService.invit(+profile.id, target.ftId) + if (ret !== 'OK') throw new BadRequestException(ret) + } + + @Get(':id/avatar') + async getAvatarById ( + @Param('id', ParseIntPipe) ftId: number, + @Res({ passthrough: true }) response: Response + ): Promise { + const user: User | null = await this.usersService.findUser(ftId) + if (user === null) throw new BadRequestException('User unknown.') + const filename = user.avatar + const stream = createReadStream(join(process.cwd(), 'avatars/' + filename)) + response.set({ + 'Content-Diposition': `inline; filename='${filename}'`, + 'Content-Type': 'image/jpg' + }) + return new StreamableFile(stream) + } + + @Get(':id') + async getUserById ( + @Param('id', ParseIntPipe) ftId: number + ): Promise { + const user = await this.usersService.findUser(ftId) + if (user == null) throw new BadRequestException('User unknown.') + user.socketKey = '' + return user + } + + @Get() + @UseGuards(AuthenticatedGuard) + async getUser (@Profile42() profile: Profile): Promise { + return await this.usersService.findUser(+profile.id) + } + + @Post() + @UseGuards(AuthenticatedGuard) + async updateUser ( + @Body() payload: UserDto, + @Profile42() profile: Profile + ): Promise { + const user = await this.usersService.findUser(+profile.id) + if (user == null) throw new BadRequestException('User not found.') + if (payload.username !== undefined) { + const user2: User | null = await this.usersService.findUserByName(payload.username).catch(() => null) + const user2ftId = user2?.ftId + if (user2 !== null && user2ftId !== +profile.id) throw new BadRequestException('Username already taken.') + } + await this.usersService.update(user, payload) + return user + } +} diff --git a/back/src/users/users.module.ts b/back/src/users/users.module.ts new file mode 100644 index 0000000..f4f5190 --- /dev/null +++ b/back/src/users/users.module.ts @@ -0,0 +1,14 @@ +import { forwardRef, Module } from '@nestjs/common' +import { TypeOrmModule } from '@nestjs/typeorm' +import { User } from './entity/user.entity' +import { UsersController } from './users.controller' +import { UsersService } from './users.service' +import { PongModule } from 'src/pong/pong.module' + +@Module({ + imports: [forwardRef(() => PongModule), TypeOrmModule.forFeature([User])], + controllers: [UsersController], + providers: [UsersService], + exports: [UsersService] +}) +export class UsersModule {} diff --git a/back/src/users/users.service.ts b/back/src/users/users.service.ts new file mode 100644 index 0000000..13535b6 --- /dev/null +++ b/back/src/users/users.service.ts @@ -0,0 +1,192 @@ +import { BadRequestException, Catch, Injectable } from '@nestjs/common' +import { InjectRepository } from '@nestjs/typeorm' +import { EntityNotFoundError, QueryFailedError, Repository } from 'typeorm' +import { Cron } from '@nestjs/schedule' +import { randomUUID } from 'crypto' + +import { type UserDto } from './dto/user.dto' +import type Channel from 'src/chat/entity/channel.entity' +import User from './entity/user.entity' + +@Injectable() +@Catch(QueryFailedError, EntityNotFoundError) +export class UsersService { + constructor ( + @InjectRepository(User) private readonly usersRepository: Repository + ) {} + + async save (user: User): Promise { + await this.usersRepository.save(user) + } + + async update (user: User, changes: UserDto): Promise { + await this.usersRepository.update({ id: user.id }, changes) + } + + async findUsers (): Promise { + const users = await this.usersRepository.find({}) + users.forEach((usr) => (usr.socketKey = '')) + return users + } + + // WARNING: socketKey isn't removed here. it must be done before + // any return from it in a route. + async findUserByName (username: string): Promise { + if (username === undefined || username === null) throw new BadRequestException('No username specified.') + const user = await this.usersRepository.findOne({ + where: { username }, + relations: { results: true } + }) + if (user == null) throw new BadRequestException('User not found.') + return user + } + + @Cron('*/30 * * * * *') + async updateStatus (): Promise { + const users = await this.usersRepository.find({}) + users.forEach((usr) => { + if (Date.now() - usr.lastAccess > 60000) { + usr.isVerified = false + usr.status = 'offline' + this.update(usr, usr).catch((err) => { + console.log(err) + }) + } + }) + await this.getLeaderboard() + } + + async findUser (ftId: number): Promise { + const user = await this.usersRepository.findOneBy({ ftId }) + if (user == null) return null + user.lastAccess = Date.now() + if (user.status === 'offline') user.status = 'online' + await this.update(user, user) + return user + } + + async getFullUser (ftId: number): Promise { + const user = await this.usersRepository.findOne({ + where: { ftId }, + relations: ['results', 'blocked', 'friends'] + }) + if (user === null) throw new BadRequestException('User not found.') + return user + } + + async findOnlineUsers (): Promise { + const users = await this.usersRepository.find({ + where: { status: 'online' } + }) + users.forEach((usr) => (usr.socketKey = '')) + return users + } + + async create (userData: UserDto): Promise { + try { + const newUser = this.usersRepository.create(userData) + newUser.socketKey = randomUUID() + return await this.usersRepository.save(newUser) + } catch (err) { + throw new BadRequestException('User already exists.') + } + } + + async findOnlineInChannel (channel: Channel): Promise { + return await this.usersRepository + .createQueryBuilder('user') + .where('user.channel = :chan', { chan: channel }) + .andWhere('user.status := status)', { status: 'online' }) + .getMany() + } + + async addAvatar (ftId: number, filename: string): Promise { + await this.usersRepository.update({ ftId }, { avatar: filename }) + } + + async getFriends (ftId: number): Promise { + const user = await this.usersRepository.findOne({ + where: { ftId }, + relations: { friends: true } + }) + if (user == null) throw new BadRequestException('User not found.') + user.friends.forEach((friend) => (friend.socketKey = '')) + return user.friends + } + + async getInvits (ftId: number): Promise { + const user = await this.usersRepository.findOne({ + where: { ftId }, + relations: { + followers: true + } + }) + if (user == null) throw new BadRequestException('User not found.') + user.followers.forEach((follower) => (follower.socketKey = '')) + return user.followers + } + + async getLeaderboard (): Promise { + const leaderboard = await this.usersRepository.find({ + order: { + winrate: 'DESC' + } + }) + let r = 1 + const ret: User[] = [] + for (const usr of leaderboard.filter((user) => user.matchs !== 0)) { + usr.rank = r++ + await this.usersRepository.save(usr) + ret.push(usr) + usr.socketKey = '' + } + return ret + } + + async invit (ftId: number, targetFtId: number): Promise { + const user: User | null = await this.usersRepository.findOne({ + where: { ftId }, + relations: { + followers: true, + friends: true + } + }) + if (user === null) throw new BadRequestException('User not found.') + if (user.friends.some((friend) => friend.ftId === targetFtId)) { + return 'You are already friends.' + } + const target: User | null = await this.usersRepository.findOne({ + where: { ftId: targetFtId }, + relations: { + followers: true, + friends: true + } + }) + if (target == null) return 'Target not found.' + const id = user.followers.findIndex( + (follower) => follower.ftId === targetFtId + ) + if (target.followers.some((follower) => follower.ftId === user.ftId)) { + return 'Invitation already sent.' + } else if ( + user.followers.some((follower) => follower.ftId === targetFtId) + ) { + user.friends.push(target) + target.friends.push(user) + user.followers.splice(id, 1) + await this.usersRepository.save(user) + } else target.followers.push(user) + await this.usersRepository.save(target) + return 'OK' + } + + async findByCode (code: string): Promise { + const user = await this.usersRepository.findOneBy({ authToken: code }) + if (user == null) throw new BadRequestException('User not found') + return user + } + + async turnOnTwoFactorAuthentication (ftId: number): Promise { + await this.usersRepository.update({ ftId }, { twoFA: true }) + } +} diff --git a/back/tsconfig.build.json b/back/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/back/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/back/tsconfig.json b/back/tsconfig.json new file mode 100644 index 0000000..35e1f74 --- /dev/null +++ b/back/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "alwaysStrict": true, + "noImplicitAny": true, + "strictNullChecks": true + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..49fa6eb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,37 @@ +version: "3.8" + +networks: + transcendence: + +services: + front: + container_name: front + build: + context: ./ + dockerfile: front.dockerfile + env_file: .env + depends_on: [postgres, back] + ports: [80:80] + volumes: [./front:/var/www/html] + networks: [transcendence] + restart: on-failure + back: + container_name: back + build: + context: ./ + dockerfile: back.dockerfile + env_file: .env + depends_on: [postgres] + ports: [3001:3001] + networks: [transcendence] + volumes: [./back:/var/www/html] + restart: on-failure + postgres: + container_name: postgres + image: postgres + ports: [5432:5432] + volumes: + - ./postgres:/var/lib/postgresql/data + networks: [transcendence] + restart: always + env_file: .env diff --git a/front.dockerfile b/front.dockerfile new file mode 100644 index 0000000..507ddea --- /dev/null +++ b/front.dockerfile @@ -0,0 +1,5 @@ +FROM alpine:3.15 + +RUN apk update && apk upgrade && apk add npm +WORKDIR /var/www/html +ENTRYPOINT npm install && npm run dev diff --git a/front/.gitignore b/front/.gitignore new file mode 100644 index 0000000..9590d78 --- /dev/null +++ b/front/.gitignore @@ -0,0 +1,132 @@ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + diff --git a/front/index.html b/front/index.html new file mode 100644 index 0000000..15fcd19 --- /dev/null +++ b/front/index.html @@ -0,0 +1,18 @@ + + + + + + + Pong + + + + + + + + + + + diff --git a/front/package-lock.json b/front/package-lock.json new file mode 100644 index 0000000..51a7306 --- /dev/null +++ b/front/package-lock.json @@ -0,0 +1,1596 @@ +{ + "name": "Transcendence", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "Transcendence", + "version": "0.0.0", + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.2", + "@tsconfig/svelte": "^3.0.0", + "@types/node": "^18.15.0", + "prettier-plugin-svelte": "^2.9.0", + "socket.io-client": "^4.6.1", + "svelte": "^3.55.1", + "vite": "^4.1.0" + }, + "devDependencies": { + "prettier": "^2.8.4", + "svelte-check": "^2.10.3", + "svelte-select": "^5.5.2", + "svelte-simple-modal": "^1.5.2" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.4.tgz", + "integrity": "sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==", + "dev": true + }, + "node_modules/@floating-ui/dom": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.4.tgz", + "integrity": "sha512-4+k+BLhtWj+peCU60gp0+rHeR8+Ohqx6kjJf/lHMnJ8JD5Qj6jytcq1+SZzRwD7rvHKRhR7TDiWWddrNrfwQLg==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.2.3" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "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/@sveltejs/vite-plugin-svelte": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.3.tgz", + "integrity": "sha512-o+cguBFdwIGtRbNkYOyqTM7KvRUffxh5bfK4oJsWKG2obu+v/cbpT03tJrGl58C7tRXo/aEC0/axN5FVHBj0nA==", + "dependencies": { + "debug": "^4.3.4", + "deepmerge": "^4.3.0", + "kleur": "^4.1.5", + "magic-string": "^0.29.0", + "svelte-hmr": "^0.15.1", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0", + "vite": "^4.0.0" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", + "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==" + }, + "node_modules/@types/node": { + "version": "18.15.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", + "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==" + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", + "deprecated": "This is a stub types definition. sass provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "sass": "*" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": 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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "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/deepmerge": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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==", + "devOptional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "devOptional": true + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "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==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": 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==", + "devOptional": 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==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "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/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.9.0.tgz", + "integrity": "sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==", + "peerDependencies": { + "prettier": "^1.16.4 || ^2.0.0", + "svelte": "^3.2.0" + } + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "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/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.19.1.tgz", + "integrity": "sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sass": { + "version": "1.59.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.2.tgz", + "integrity": "sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw==", + "devOptional": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz", + "integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, + "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/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.56.0.tgz", + "integrity": "sha512-LvXiJbjdvJKwB/0CQyYpDX0q+hFqCyWmybzC2G6eK1tJJA/RSRCytTfNmjHv+RHlLuA70vWG7nXp6gbeErYvRA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz", + "integrity": "sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^4.0.0", + "typescript": "*" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.24.0" + } + }, + "node_modules/svelte-floating-ui": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/svelte-floating-ui/-/svelte-floating-ui-1.2.8.tgz", + "integrity": "sha512-8Ifi5CD2Ui7FX7NjJRmutFtXjrB8T/FMNoS2H8P81t5LHK4I9G4NIs007rLWG/nRl7y+zJUXa3tWuTjYXw/O5A==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.1.0", + "@floating-ui/dom": "^1.1.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/svelte-select": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.5.2.tgz", + "integrity": "sha512-uvTOJyrrD5OnSCAv9A+gLtIeeYHL5PUw3YpnuBkmfp7a3IHUyjgNNM4GIf462Lh9QEEEM3nD0R0E+G/Jp1iq1w==", + "dev": true, + "dependencies": { + "@floating-ui/dom": "^1.2.1", + "svelte-floating-ui": "1.2.8" + } + }, + "node_modules/svelte-simple-modal": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/svelte-simple-modal/-/svelte-simple-modal-1.5.2.tgz", + "integrity": "sha512-kQ+9/bonxMMJe6dGTCPXBkYQQ4zF8rqqPp+PvTWOJB8QtB+Z0S/h7ZJRDZOAnkXTUClwd+Qmb2HHTIXVkjlSvA==", + "dev": true, + "peerDependencies": { + "svelte": "^3.31.2" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vite": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "dependencies": { + "esbuild": "^0.16.14", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.10.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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" + } + } + } +} diff --git a/front/package.json b/front/package.json new file mode 100644 index 0000000..3747249 --- /dev/null +++ b/front/package.json @@ -0,0 +1,28 @@ +{ + "name": "Transcendence", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --host", + "build": "vite build", + "preview": "vite preview --host", + "check": "svelte-check --tsconfig ./tsconfig.json", + "format": "prettier --write --plugin-search-dir=. 'src/**/*.{js,ts,html,svelte}'" + }, + "devDependencies": { + "prettier": "^2.8.4", + "svelte-check": "^2.10.3", + "svelte-select": "^5.5.2", + "svelte-simple-modal": "^1.5.2" + }, + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.2", + "@tsconfig/svelte": "^3.0.0", + "@types/node": "^18.15.0", + "prettier-plugin-svelte": "^2.9.0", + "socket.io-client": "^4.6.1", + "svelte": "^3.55.1", + "vite": "^4.1.0" + } +} diff --git a/front/public/audio/edge_hit.wav b/front/public/audio/edge_hit.wav new file mode 100644 index 0000000000000000000000000000000000000000..f50262a342166822244255abc70fdc7e921dbf36 GIT binary patch literal 8012 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 literal 0 HcmV?d00001 diff --git a/front/public/audio/paddle_hit.wav b/front/public/audio/paddle_hit.wav new file mode 100644 index 0000000000000000000000000000000000000000..d413a24a39aca478b5129378fc5b5a0c03b5193e GIT binary patch literal 3372 zcmWlbc~n$K7RDPza06UWL_mS=w^Y6Nx*K(nsN;erQOAkn0>mw9%wQ6?iQr7cB`BIW zlFQvRKI_G}(e)rCt z^2QssFpDK)Li+2OE3)JJSS*$xOBYM-6?5^dizV37$MW9d?8O%I&UBNA&WKLOZ;sz8 zJ(Zr`d@r8lX?~zP((QHmT)D1|u10sWyOyuw7rHauh30R&L>^-f0qy10)L5;s42;dBghba#e0lO4&9 z>-GwJqvN^bnzOr-`PxdEIWo30Rs1^yHq@7 zrT$CoAatu{eP(O0rPAZ*M!Jc1o6LuEAy0_JIqPX_3kU!uN{kx%)b_O1)9BeL6beP| zBKJzya#uegQcwgW{Oq~yN#KX@Ke=wWmhg-DOlheUgJW?R?u9=?+mRK=<5GMSKSGbt zX1p11)wXJ1>iczF!&<5KwYFW^ri7d7K!sCI=*RT=+B;e${sjjqLCRfx2XDilW3MSp z5blc0)Nj>DBhrZT4)s3vKJpItjqueQ&ke<|`ip$UK0$Zu$=($2Ds`oLNxmd!$aCcJ z${6KiZJoAQS|qLXt?<=E@DXLsubo$&*PNN$``l-a&5pf}gO0P#Z=BnP!(c2<9qvnaTk3z<-&YOgXp+s_6T)MoCl|b%7cSMuPqD5d5CG%>08{ z#jJ(vU>n^^m(v&N*O<{v6pVynpf8|U8@o9+FZOZMlO|rQ5ibb;6UK`vVuUNo^`zFQ zO?6LkU#dA@qtt4(OT>4@55*6}CccHA=b3BPPZ)p9b<{Q5Gs;sgUzUB?z@$VLsKh?OopzU$imEsPQ$G3XFUs)tGDyHylQ$Srgys=k-ec zwjQNLYvb@(yb7%}D{BrKZN_+nHe4%FOVm^PX?>^>YcwjY3Wcq>S!>nqYIn2^XalON zdsg?a$gIe&Y!5brox!ePKVqkHZ*pU}vD{aV1CBIjy0f37kHf=>T#&=!IGuDVsW@qG z(tT&ObFit)9_Man&!n)VmCj|(0(KXBAKrt5nZe9Rm;yfpAAm3EeRMtjj5dHD7(fS0 z*uS$Hr*eOsm(YjkI5-4`nyg?}Fj@9&`*>~~_c}9)>BM%8(ev8hhKBrU? zliA>3z-QO&L3Ah`5!oZMJn~B9h3Iq9X)n@W6nF|eh(~;++)uvYx#>xjQl(DZiEoKF z#h>^Jeuxw+g`%G5EqR)}+Qg2X_#Upp*=P+KhsWVAYLIGIlhjBpLYu2E)Sqcjv`QYlQ0E^)u)c`qg~1TD_|dLGkDp z;g%4E2B8V+cr^|W#p!4^YQ(?e6qJJYpkg!_$KXg5iQ2ra-kaJjEk|9e_U;zeZ6G_4 zUFKNk_=&mBbg_4}^CpE{0XK*n%njrsxhHfTeZ}Mh_I-A!NfEP$nF*$Y?rn4_y&9d1F(SFK`p0NQ4t^v#D&I% z4wsYV1TjwhOx>=UN#mKtr}2BlB5{{kEb>B)@K|^z9F#`sDkuK}J&T~PeQ4vmmDs$2%^p_|O=n574(M`N}i-sT?AOO68~= zC8+T#g($RF*drv1qr^dCf3eo%@x;qRsU84>|Nhn5+ zlgqUWnzhbWcfx`_Z{X}W+hk!7J#{6q}g$S-D)2JN5KvBTDsND#>4C( z_Az)2n&@V_I}^%0XX=@2?2l|L6U)?+ZnBdMkQL-ja-DUpb+@(1+HA7iw%m4;xIv^7 za|y$y+MZi~x0VtIi3)HFB*PJqhaO0qy}Jh70|%IcrZ076v*2pDm-&*(HD`wwrkO#k z#xCWSZ~(IKH6n$WX4cp_>Jn8t;Hv@i>K4^Ka2c+t(qE-=<$~fcaVkm5NpmLh^AGqc zu}VxwX($sdMY?JD5|*$}_Q~Ug3Bp)mjF5~|@G|uSbuOBZ`r$r!wVtJa>|N`PRtKv4 zJT^pcF}w2AHWrG2A+Y>K?7J}`u!Yg0d;`dM>T@qK@fZeve-53Ws@FM4~iin zc^6cHEpRiOKuw}DY-zSaau>Ot&Y^o#;pRC*h7smeX6t8rYI|rqVAe<+F^HH!WDqB) z5~|YF;1Tq}BxX3nFf4Px)F2Vs;NPejluV2CLUu9xN0-T^H_q#mQsrxiI_#M9zw_88&=QIuR#g?L+>A-yHdKr>MR zDnuvbV{(JoEG`q43LakO@46~oiM*AcC(IWP3kQV+$tEq7=1KQOxA>F%qr6GVlaBJG zyw?PXj94N4D5c4BWh@HfWbZWZ?Y3KO%|X8hB?bNz&_htj+Jub>-8c(3j7?_!tihI< z9+3?{hM$17AcxMSkC0!Hy@@`=Wm~x|hs+_1sA9@Rnou>=arg~91y8_Vse9BMI-O2r z5}ADPA8^^6b%rw|&G~0Ja~Mv8{b;`^gt&FD|v8Zy(m4+?4Ga8Zy(R+-ZNJu1PI%Fy&3=#o31+dq%$KxKT z8;FHOf!Ak1_CWSR9zgCx8~~G{Q=r=+e?yu*EuH{K0L1CBd(t5&$Q#c~&tlIq4--O% z7(6D=B~O9pI^-5)2xJgsx@U%GHDnE>!Bgi+@FaTfLheGYgFCA8xIGUbkHJ0ndwjr| zQivGB@UT2b&?mwOAem>9QZjv1)nhk-0u_53(pTvw+9Cy zK#l|48n`*IqpdT0cY;??C?~8`~B#79-51Io__M~}MdRBO1ps~;gp8Fm&1Pz%4{`N3P5JUsM zGZusj35CEQ#h%X|*Z^$6{mcEUy}z@+YM^3Z%fR-5Fi)W8EVKZ6&+ER|8ptZhUjyq0 z5a6#@gKH0i&kg|ZGYWv^VR|SYnrAlnj>Zm*AIS0Kc={oIkVT%Qo&y7W2KGV@LbMPi zMCg%vPI-=b+B{tzECdPp>?!tKgItExKfx0lvS?WKb1pq z@Md_cd{jQKykC0H^Iqs3;uGN0=+)-+0D2pm=QY}kpfZ z>NU;lAMd}tyS%!+wgT_~$N29n(krQwI3+$(FX>$A9BGs!Mq&|~g=vyBiCJcm!6cEADWa*O zK~it&TEzwhU&&T}m-osys@AL8b#1yFeV(4JrD@k_HfZi?Z)x-Oqctr0i{&f8UYt5#R7top~k+n(k~c8qaO za8hbWH8!`+J=~q=UhZDzo=`WTZd1dShBXbV8dlb>sdZIXRoA%cT+z-*=L`EQ`!mNA z$4uv3=l!Z%RmW|oZQrZ9sunw!IbS-TJCj{$u1i(ts?M1%n5YJd;W$9FK1NT}5p*j6 z?&|O9SLs*kTQ#j3U%j9HjOmQY+XAt?w|%m`x4yC_S0k&Z`A_uUfZB*kN=ZtYjhKa) zK%Y$i>fmSQOSr&Ib;U$K@q(;oRrkC)`)ux7@>=gPalEQQUv|C;7B&cJ`&*bGeIh zm*pz5WLcanZWbm7opUhjaMoDvXs(8%=TvfR943p->R@y;=CEe6TG{RFB>;gOe~yGN z=kMnK!~euCW|y&wSnFAvSz?xe70eE0Z)0v@b~C>*J}-dPZs|b`kdxcM-D*!wLVAPm#kIVT|SE zRpfERk;D$tchYEF9&Q$H4(IHvWGdqQw%Kgdj z;o|^aa9(iIcxk--+ymSv?8odVfIpajFrP4loBo2Z$j@iBNCKAJz95n8x*t9FMr*TT1Gj3(n_?L93@i_w14 zf6^Z{95JB5^DJ$)HbfJkd7yZ%II7&M9HjDBMJXecU5YM6sZt2;Aw%_C`9>L~iO_u0 zeAiHv6y+=VOL?)fRQXx?NjXa~OYu_N7*-lYsk~rWt7M zZLLAnAy`}nH=dQiTF>0T#Bx#G2!0fQO6J7O&pE|89XYKz{d`E~*sT1lEje3rpjptY zLV(3Ni*oK~JP!} zDR*Js{JhZNp~E>jyqsIvSF?Nh(9E&iJg$*z<3f4AxEU-oE0>wg4C01xTi8u(F+;+z zGwsaz%(={L+He|`N}#S`Y-Ie$KFvlk(aaut4}CLdGv_|{9@oS2Vvl0yv0FH;94d## zSp=?1WuO>un9rCO7*`l$X`^XQYBkkCc9IW}_L0J=5!4Pw8-vMWvvL`^3>95Pf6si! z?BV?6Z0G*X&0~yU6f=q#mpGR>@vJ!34(1LfmWg9-r~OSkPb;7$(BtW002?S9DYwYC z$bZoPpg*EMq~0UlBlVDb$zhZb$}Y-o%6|HOx{9R$*Y9Q~GvJKlj1!EJ)REMD#%M+Z zqmi+NxRtnAxh7o9!+xD=C{PnknLlSfa^-se)s|qe36iU{RtpUK$MWmuR&} zD^`nBq-oNLlJSze;``zUqWqG4iE@#0q$FSRTJS>ft^7y%lk&&q*TvVxFO)BoBh{nS zV-%wmZfTwLh4h(ph|E{^O!8E+R=iHUQ}&PS8<;EaL~lhKgd2nou}hpS=gafu)oN-rAB-Q2Y&}O0(F~}SYK=Ne!`EEZ zT+v+C+|V>=om#uDPPb3LLoYKZ4O{hF^&ahjRtYdyGf(qDQ>dA2m||!&HJD}_=NQiz z&KMq;@0;lrj0zu{j}2`_S)Z7nn=e+Jt1wkqE5@3~m~keoX|-jY#bni5ub6I`HW}6$ z*67#kA!d(BYM0tu%*|$Xjke}z!jFWM+|=BcnJ+S1vsi;%4)CdBb(Ce(w`uoBhO*ZVWyxbpvPoP%6OjfAY(XY4CWuq zR*VM)MR%gx(J*Wj_9EsYW&>;!tm>=v>&36vzLI`oey+A`vILe7DgP)bmXr&M1V2jp zN;(8>0$+ij04_`x&IR)%z6@SAy=-b3QiKw15N#CIirk`PNwQ?Ic!_wY_#g2g*$`Qu zqDQenxmY<{HVd$;`?6V@S(>@pIa)73VpS@cDoP!%zNfsYT%!3yGeVoI9jBV88l-}# zmMT{%ixeLen^fCW7$s8qO8Q26TY5v^D%gbZwFPvwDMJi^0bVv8pUO3&Tt@`&j%fW374C zF3V5LLF;a7V`Xb4-idQQvp=ykj(opHF za97|eGAc+mhK*c_ujJdZY~O9)Y^*9)Rd3bLs!E5`vBk2%!gXXiDnd=67%rY`;hMQB zj+(O%%!9MMv%Dv~r#upu$W7rQxK?oVChI1vpXFgGnKI@++5sAwNn$<$AkazlWAwxH zbMylG4CXZE55OIQ>4EeG)P>Z?^hfj+)D_enq+O)R)Cp8EL&i8q|Cb(4jig?oU!i|v zer5Jheo`h9ClWuCK9WRa3Av5dO3P=BVM&=1=6co!mY%I)zhb>(Rj^I$AKX6fN7j4R z5XMl(b$~=VoPM5pj@ifQ<4~DYFuHd$XL9Fo_p|q~*8v9B&**39sd{Q7t&tW(i>1Ly z@uXFx)ufq}8I+*_zGPqWY2s<(E5b`cIZ;T|64gW*PL3Oo9*?G>XsG+>`{=XSv)Ddd zFD@CEf}4n(gse$*rT$3mNi9w-O2wxVQr`ez)3NE0RDh%bxLrA<+wZqGnc7X+POfvjZL-ZI(Mts7 z!t%p{!-Ci4ugXUW#|U*|l{i;4LS!!2m(v7H!F$0wfkZ43zgHG2xmuRCSXHjNCcY$Q zh}mMfLZ+yaSITK}ru?S*ih7IsAN3366XgfRXT>wg6Uiyb8A+$SO`azkCDTi_(rLmp_f@GZJhT^s&LKUh?QKTvs zsTZlO28+RCfEeFt-)PsVHmTmIpR0fAAqIs(3aWwHP;M5O`)ob7JNEl_W)-#SAKPx* ztjZZ+WE(0+*+<*8PK~qK)$D@1;ck2_zBb97dw~wTRYA*(Y4F9-F4e_-__^n zaolv?cBZ>hT|1q-omdCjk?uq}7rN%UVyhCW8Y=24R=NIkooGANwyFBs1lQ)$y_4;c3ua+ZvBl6i)CfV_vi zhPaWqjk=Mlp&4ie+KdFP4WKcfcre*JmFkpTxFy((izw3 zSLsTsnkrzFF{I!=(wJ#X1KmK60Gy?SQO<~BMlgR+`Y2<-`mUyGse^zPxIwr zV3r6{_ab*7l^NQM*BLJ|u3>IqMqx){pP`#vOTks}lzim~fHeT~Aq>bX`|_t?uD*R-J$lV`_+NE z5Z!&vZOu*19gUCPTYpe{P&)&tc)W_Jx}v)Lf9{{4PE?yTdd)udAvI6Jl6Z@Uh<8f1 z0}cO16byLRIpx2~nTk0Il~f@mE2&D7ny9uaEQ(-th}y2MQjb%OSBZ6E-F={A2Wf|B zZ|JY--2e^xCcVH?YQb8GR*hL{W>hdM&RGAowp27%%mw3=;-oqwtHP_!xh}dAYNBe= z9XQ8{ssmMehs{w}?Wkr{^QwF7U3OcgvvQ5&PsbhiefPh$Cu^nZCI%MnYaJJWr+?{Z(` zx5jUyevJCDD}87B#LUT=3CvigfGuI`8EVEW%3F$vAz-`)T6KWZPZ>{{NV!eCL98Lx z5zTlb{wex7+K#Ej6c8^ER{`&qCBO;sgeREinANydxP0PxVm-k{pyRl>TAT}4 zK)OiE1svld`aIf3a1aiY_mj&AVgiMPC$0TGx9Cc`9B}PC<_Kmvy_7zb?a#hUzevY{ z<5`qUii)fz?;!m{`mL$WG&4}wakRbEgVc?bHIxWS3}qH+8tEOOkkCWwAtg}~DdTVx zabHoLC@^SntFeD#8!{R)Qjuv$Yq}-fJ9SX%zT`d0&*3lNjVTQ&KmesxC%cmQa6Y^R z-U^2&#V1`)xSg;w{_l87A|vrqLP5fm_-XNII1-+oj7)wDe+{3NGAHG0T6fxpl=Ug8 zNg3dZn53hLClY%R-w^lFPtkW#*HHneFjNz^7Q2UdfOw2}ka!J$7q7wyF`uvkY&FS7 znh-rTn(QDrZVT=Sw#YZgf61YW_43v7BdVh+KXrimwCaTFKShDUOFf_>>M42|7-OGw zU%-eC)pcpwG!JyobR!JehEIkPLzki5;AQkS&ehM+Z_sVheb;~0*J~Oz%YepJ>D79t z)}=M8460OhhWd;AqdZU%sz_AFsqHGeYOQv?cBOWO_JZP~f+Oe1_XAE-FKdu#BwEP} zptK8Qmu1&f7gaStP0x@`kzJBslUt+)X|&$xKfwo&n}kQ_*5-HodjHw?tJ&R35dTuwQpvbs!vRj&(JwYj)J` zu3hh1>pJQ>=K5Uyxq6plmt$ttjH-3^_4ZM&(XPMUTigXTmup7YhuMLfR8`@ua&EP6 zu-hwYD|)OQ)>ccmMPMnhj5AL(SDRd>cb2!7Hc)>FdV>Cp?q8kL;4tX5dM!*Dsf^IU zbeFZ4w4MrxZCt?EfE;`dUY;sT^+yIG9|9i-MU_}6%E5|mVrYr?I{Se`*b(vahkV~~F%wjSAxGnJt z{3_glFdzZ}iW7?y-^ag;f0^()fs?>WkjE+F)NlE1i)(0yz@dh3Uee(HZCnP-}8=nYgFu7w9ACgXpLD7x)jj_c$IfopMOo zq)EWTYa}<43(+6Yy~H2H4XK+_SGKKe+oIU4SfpL5jnYNvp30xf8$lg-D7z;+t~{lb z1I}+(+LZ~acokIbt*%qmsD`Qo)w{KSYg;v4nzQmV^1ZTsvM^1k=B56Po~5N~H_5ll zM@xoF3S}QmfUvW?vphf$ zD99}1mrW_1QaV#GTkur)P$(6ugrO3D$zADV=~7V3c;YPaT;W{dQsH7DFrtJ+2|=<{ zu~gBdYF2fs+trV?Pqp(5a}7ij$z(L^&3ml-twq+4)>IqDwy0`W)r+dPRbCE{J=U4v z99%W1>X-GGbxY;u%HhsD=f40HC)wF%ZwE^*suEt6QYClFoKveOR~NW0xY``;j^L`G zstRkRby>xdiVL;^+a1e&i_K&;l^F%bFtAz-(hSjz)8uPDXg_P8gEix(`iA;};;~|p zYQ8E!7of{A4L3cvKDMe&I@5~E6_r!GCwX@fz7o#S&(hm5Z5S3nXBhMW6mD9)W14_ceKE*r^sHKDY z7xPbM9lM_WlKPw)2RPVP!e#;k!@zi9eXt}P9#@ZP!i>U?z~3d@BP_u$!7s)v#+*qz zoi-OS53vie6Cq8JrGROVc$@Mjs6HO3IFiJrVgKqeAw_?u#8ZXyl+TrjI6=G)kJNgX>aM ziK5_hvu9vNq%@xfN`3eFAUxgh)m#|K_Ksa0YPV`Y!B>F5GUp~IvSYj>- z5%>c;BTJZ9npHZa)W1|xE-FWrBg=mRO&?nxQ~pl;9yqkg;)B9{!YFZ^*d)@5s6em4 zL9gSu=mh9=OcHIDY?6#rj#duSez^8CATqxO`p7 zHEA{bT)SN`2h2frFf;iE>R1pXQ}6?&neF-r)Vc>{)|9IEGwGz4){gGXt}gXaQ-<^L-K)txs|b% zF_|%iL7?O5U`e7<88ilxmCjmAUr%?_Yv>*ZglS;t7*9A)IcvFVxqq=&v%PpwuvFst z{@kHlA29XLKrRLVPIA@L#bF4uF{a~E*ubCcN!HkzHmuBO+~ z#Z&?H66F%*Kf-y!7wiWt4nxAAfc_~5{6mM)V(L(hs7a`CsAgmblAS@zz^9Yamu4)^ zc#V96q+)1b=C@!%km1P78Rs%qpw^-uAa5Y2q2{87V{$OXpdaxmqc~$m`jm8AdR00R zT#G_xARnL}q4G0EXAqGD#yQk^lmer~lwgW5v(axYZf#K){EAOPD)No$Wnq-Dbk3>ipPleiS~(9C8`p2 zsk+op>Ib?V#nSQOv0@xp-^WVxrN8@khXe-%rRC-2M}ek4B|IZkO65|2S)hywyj+1q zB;f&Fb3}eb{tbAjxnS%EYJxRWl#`UL%64VCHbuJ@a5bq;s9ULDt-oTpU^t>brk}5# zuPykly7>bd!RF^E7b~(SaVnNP~%WmDW|KZgR1FPB?H~{Lh@Sj5~zHG z#0b`e4(U$$Z%1ple1vqgbRzJB>(!0wKh-PM7E`4u#hz&YW%L-+n^T+72sFaLGx1&k zkNy<(47HS0L|RGyi+q`Okyb_%(6BT#Z4h-3bqQ@5t(n=#>|yt^?{e;N9>AMhUX zO0r9{eKH}Lx4`q5tgx)uOnBxI-a%d_H#b@kW3?orP!Q zp|fyV7x@MJt(5bZ6c5GWWJDPFr8r+SN>n4L7TC+G%dVGR zDxFz6uXJdcciHx`on@jjVc8&nPbHs9Z6AUG#D0yxq@xu^W!vNL7* zWuwb9rMl9A(qE+)%dVEaE`46AD>f8ImqeBf0kvebI8S_2a9eP{^g$_GNEgnM&X<0X z7D{J=9-&2HRE(76%W6Q+n*n^RyYl<;nbN5Mv!qMp^X0FA&w531Nij=3OFdaLMN!wZ95Q=#!!2dll*9u-r`RB{v?g-|I`R;tXZ7Il{zt4-H_1{3}h z@QrT(j&xLaT=xd_+~%nk0w-&|Do;037o&;R6oYei18tJto!&jBb8KgPXKbfCq%Ne0 z`k8u{f1kf3b8+U`%yXH)eI+FjR0X_Cy!g!MOm}u;wl-6l`GWtNKQecC?%%opN<%VhBAykY!dd^JxCdf9Q@*}OTtFWfKOMVv*Pc3vy*ZPtgZTe(+r#}At_ zEIkX6^^X6J-iaq7sK`9d-Fjh;Y!#_b{Z#%qhlBu z=K-fnVx_RAFeWjq8J7=pP3E02UThMLj4)k*Ta{PAmHZ&`hpUOotka_+i{V(Y*>UNau zC{YVF!jSUNa&kGbysfmo^i=W5;>?n)k_E-{i*FR&EV6y6_)_$x_{*uHQ$?>!UY8gI zdciiq-+~dPBT55H0!pOCvf`wY?iPSq1^O3z#k<8r1VaVC-@CrJw)jhFNol9BT}T0a>%*c0 zqQ7KoWbpv=K-L2-$I4erS4#`T=fp!mec32mCkvH@%brM|NLK)#>>#KcDy3X`O??x% z0erokA}4c`nu4SnG8$n?lGp!eu^ zYjieLVA2W>{8e)-nE3{@cvL%m!dQ9mqM7b0zme?%}NCS$DHan=&v5?%^GJU5;z1M?+>AH@I2E#l?_Uvw|`5O+Uk7pH_NV79Sa*i*UFxCy*? z-Z}m`{!0ETetl+b=FlAfoL|{J+44+vCJXfAegGZtk@KE2ikHu8<9yU2>V$gTrAHGS! zNx_r=a=?`4Y0c4~Pi!revxr;FFW&QI*O$Jc{-VrMZmDlsK-s3U zjb)EY9+f;Rd0ygQ=2ylpVU^St*B75CIbJfVWOT_q!92lb&~sP~`qi(buchx4Zx#C_ z`~ROyN*1OFapjnD8t8EoWGLA}kZ;P9XUo3>PX90PN$X@aGBxOP92FlBr^+$%d&=v| z-@aD1il-`53)R`mOyxw?WEEe{1uOh4b*4UBzt_0a_|Wjo@K*mq->UD>&os?2jkJui z)LLpR0<+l6GSN&S<_L4Cso3-cWSW?uSA3%KMCGi?*_BUhk8JoVQq}Jq(m614w*nBW z3DpDDo@%2@?`n5-x^%VL+Q|)58!ptIt6c)JOoM9&)wa7k+y!;#>;A0$6L?M=T;tqh z-H#ieG!`{{ZU|}&ZtQ63YI)oGvbCgD*c#g6-;&ihym4pK-%X<$$2LM6`s;g}2b#CH zZ*8ybtnX}WuWw)6xummWNXL*_iL(=n!b{>tn%+4I>m+0m2)%00?03WAnK^DqV&1MC6z zC*~(+2tAbEL~Wp+AfG1tQhlf}Ry=DYCzlh(hOt8#K@1&DPa`uZj9>IVIw-sJ8T6U- z$>fP-3V}v=K)6qs0zA?Taw@rj*i3W)J)cNOA`D;$u;T#E;7;R~;aA|RaSmJ&wiN4w z^TOT7J;1F4oaPaDmVk%j0i`FD;Yx9TAXg%9re9Bgmi8j8HMu$2lxj_F%Bar(AxOj( z#8rd>Aw^sS`uJN)M@kcT_$2oyZBN>r^cwiBBN9g^#>d9SrbHp4c17=qJ{EH_=12Uu z_@T*u$+_?>xH-X=FezzlQWLxbE{-dU8x%7%MiC{CS`S+X(?;o|urcVEPFNRgA^B>H5;+rAJCxWxO(RX<4ZXy!Y|a!==&^dC7Kw{<2?XCFP~%FUwz) zFA^*g%oENRPLxiN{?0_rmCTmdK;jQ7gUC`PsS>@|AVx_uqP+}pP|F(8nm_A5&BX3y{0`TC%{~Q zgXV)~AluEY<~Fmhb*OcgZHCRuKFB`U?qe5LiYt|sib{Kxz3RH-n&YzbinG#bb6x;F zh(Xmp)upadFl!919W~o)mesDP&8f+%X>)WqAg%$Y%~j=^=9=ufRdcsyT1fvnIPYw^xRepcZE@$tH2hTpe4>_R93mY~#0r zWKkkW5P4;S=m;OQN4Y0CCpqx|&son|WF{G`^=<5Vne#J0@jvosaAtCX*nz+qJ#3OWG0ivWj$u! zXX998mLJoHd6{{O$!9Pah4e3=Gf_Z4OgTuoOuj)DQ%k7{v=rJL@^tbT{6zdexUD!} zQUK{b;6GonU$Ng&Jtz%I0n&@xK#8qDg=a)%^e6WvQxQ~zDb<+jPO48@4qpsE2|oj0 zo3JKfZTy<}mvOJ+&cvRHjfsnn^Nsh5{~Y@{79Wj`_KF!46Bz3syDWNnbX06qY%DmA zjU@u>(3X&zh)K+k9TwXi|1*9_oLAhMLF)!pwpF#Q?^xF{v3pW?4e&PpF56b-TkK!_ z^vk0!|9ss2F~4YJQ7GUr*@8?#VQFD$h5#kV6!XMKgvW%}h1Y})l6uJk*&-QQij?+> z`b38SZUQYaQ!zu~lGn)B%Kwy;yizsQ~2lzKOq!PXaBGFPtbGDasX15KIval=YUa6KoW82wR0c!e2s%$R^q&-Y*Ui z`H8NGu8MRros19aM<_t2tV{MmQYZ)}4)soTzh*$w2UPF} z^+$EJrdpF};2Ro^%|@tYzy*I#Io}9@UuE$Y|lT%xRg~a;^SaeM4h&%mea@m$&Kd6@JDe*a-ei?dI&X$dIPA$2u3KQht@~i2)v?W zAcdAm&7|%i?;sD5`^g+KpPWohp#DMoi^inTD1d^KyD8r(csiQ?jP{B)mO7ex6QGyc zPklyzNH1i40W<6g>n!6O1HnWv`&fM}U-nQ?b!M{{aOQF<*><*!C1(w1=dky(53-jr z7BZB;ud1X~&}_6S8l6t2pJ4pQK!WieMTw{MgS^}Y(ghNVj3!^ET&66dETEK;MdYKP z=k)>i1*ZYN&vo=IbS>J2{(vk(RwB%ZWuUM8IOSnVGWfA1S&|%Z7kqmB)c8>VP`DQy zpNLO98h(bXsM^TpNE{3eYY*=XFAXaW z^Nt)8`6}vJ6gq|wV~?qbxgY%~njOiEoDn%QvLNbw)OWuhez`3P`zTY3dx9mw3#0X~Qe#nIAO zsaP%qU5bC@7%4`29OPonGOKI^$k7&pEcqUQ%^-tOBrgR{)@At*S+DGc^y&Yzvkelr zWT9k{x(&Kvrd-oJ%X|yUj5NE<)#e4(dDgks zg`nT?!78*!Ez#yEGu1+|ys3Cw@x1ayZTV*V!8!4X#Eg(%j>lQT4Z>nr_ zwDH?GZIP|ft<~UpNo!eads9nOKuc&#Yg=O*v4h;9Z`ZZ+x&XfOzgK{~*k>@%lnJR=JL2BIKwy!mWp+NzK_0@zMXDhX;_26 zxLwCu%ff;FK@YQ+`I`Qceja$T@c==zAlezq8A>1V7jR4#5%bC8$Pu(q+9K)_s*B_z zvB@m*LGmGTGAW64jCh<#1$ns1pr;WCw5vbCpKuU+7@LFTW6z>5pyB9v^d!t=%)Q^4 zAWb8l$%V-U@B;X}qZDa?g@V#@gibTq9Otd!@y>PxgZNsg^Uat7P2X9OV|^y z$6g!iHr5gCM0<2YbVG&P>SpQKy0zjp;y03alJ!8Z&IUUZK$ug8(xvN?tq7~j;;`H^ z+&BErJcJlRLAq^|VGGE4dKtZpbPL^b!Fs_uVD2|J8k>y0rk|$6z;`dQe75-80&Ih- ze5$_Kifw7OWLrdKY^7IapY5#evMt^gWrNtfY`&GgK%vS3KdA)iAZArqMKI_ZyDQ#+ z9@!9wkE7Pr=%Ut;YD%litM>zZbQQV`Zj+nPfNua(wSIrYfreoKW9moMUu?YASk-K9 z?riR97Bv+&&1{<2^r@+^=~Cn6#+{A38w4?nlhWSnkTeQXg%0whgfju@*15T2BbRCMZ>l#eOMG<4cH zB)F#-#O8YGKQS7jUkqN2R`FBVX)B1kVpgQ9f!sQ#l%M^MU$d&(Jx@HVas95V2`36 zM`c8&MeYdM6*4YpOi);GWH2w36}l7LpJY7j!P* zLV!M49qbz#7cM37?v2eI{2^Pims}zQo|QRzHWkUqHT_JF3VvN(xlg#C2iFvtsiFu`UrS*aBq3uk?nTju#FP2bi2(YLLwnkgMZHjH0?RQq< zj{T1P2LPZx)v4}O_jT8GR~$eS$kZ|1RCiEac%8gPShLKv%0;UtSNpjG-2Z`Wowin2 zJJmhKO#v7O_WC@pdt8^N(U%Ziq307qMow<_D@ZMrsn+e3io0B2fHwJMr5 z&6}IoH;-$X)Dqqj(n4>dHw|wb(b(PC*%;Lx-Tu2Se2e%RkrtK__A2OQ(Ao6=(w*FD z?hfuh+-8kD>yTM~Edn0=t=$j?85TLV`#xgNY%t%HQV*`C1 z{Se5p_R)H2?`VazyY$=is~}?vV?;1c(N5E>6e}fkbmxBsOUsel*ag^7R4{5y>bg`Rq8#yG+S#-T01BXx7Xx^w_@oGuOOtn`>`9rGJU#h)@{izPo;^)Q9k4ub6jCl&U&i<%=(fFm>DrM`jPHx@iTe@9h^9wlB5{!kppHBWe-geZ zd|`M&SV7pEu(x4Nkxh{~QQ1*_;lILVV4iIY+!~k`lo3=AdM-3?AaCFw(+(4evX%17 zIptwxQDw+tM6sYmQZm16ZrQ1_(`9GN{wwn@3oLV%R+Zi?zf-XI{tH=b+rSw^a0>U&G(wE?!SQ< zj;l?tN7uL4HP>a=4X;~KzoTcELfiYeTJf<}b>l)xq$xVXBA~1K< zO=nw9f~^8sO_nBOlYd)4+s@`4&7>wu)B5JM%^{6pjkP~&er!zKoVXTboR_7qNJnQN zGo~|UF#ZPnU6gDUo6TeJgnTK#i`&Ls4Yb5UfEfTPaO@ZB7mLg0u$OX{a)z*d*{_+e zm@8N-SkswPK|*3R^Y`lnE`i$yb}G!~PUQ~b1aLxG{;cgFb3KVUo@oL_eJ#)ztH9m@ zEloz7N}EI5OZkWLlQcjQk;+MSqJ#K?@PZISh$8R^*@Vf2@q~T2gSa#JllXL?3sQ)Q z#PQfk*lw_6ARHNi49N(|n2DN&`rV6Oh*^ReiyV#2O&gi^G3`xSP+E9eX-ZMb?d03Z zm=s*fE5r-L22gVbK)&L9VnHG-J|ccM$VIG+TNAf7etrBvTyNaq1pkC!xF7sO!k2_` zabx1hvErj4W(p#HI*$M0G@cctiL=*gzOBlpnglcb@Mw$V|vVpS?ckeJ=Xks=Ha| z61hYx%2$-9i!;PT0bX#a{7QMZpi`g`=|$nvAn7KMA)PIrCjKSzh;{%h6)zN5fWFsi zkfnYgc_vYaBqEVeB!r7o#QyRj@`tLYs#I07DqE4OSg2S4cJJgX1}lA(;b5QGWw5`d zPF1V=uKA%kXgFY?8yUuUW1Nv|kI318}b@9*Ke$!->{(J zTJzOrcw182;f}){Ad=XAz2$mKK#O0?@|Kk?*j7|4w>=xI?&0k%Ev+qm&Hc?$t>LYQ z+K;yn>&)&{bjmxux(0W}bVYQ%>-yN`+dZWFY3H*}XeXpo)v4*6-94i_?Hlr2Mt55G z?Cv?;^+W519z-5NvWRq|CBvG5#$vE+;Lj{(FJoV2US%@qH2P(bue*dRz^%aifmx1S zj=hYzf~i1T(9bZhF#n)8p<#eWl_EbOeL?PTI5HQRh=e2m0P|~W+SW8(njwu0k_`-y zY@?-7(pDf=AeJNkKxBX{^}^IesfHv&QYt(Zekkcs((|NeNuLwHB$faGYYu({z>(-k ze4g+$AtM0;M(B`)cX5SrehGdFL^vM)A^uCeJH`?7DEfKyLD(KxU1VcqPt=d77TqH3P5s?&;5sm_@_k!@cu)46dq3c4g zhFlH_3JnSU8S*3KkDygSs6b@k+u*msyFzw`Yzf*HG&yi$;I@G60aF7e2aF6H88|#> zM35`k5j-|ze8|w?A;HfBp9PKz$Pe%W8~+>poBbtz0zZZy$1ln^!uQJ1YeQlF5&lX) zjbHT8$e~1ElJAYdHwRzrE9j$qqkS`c*MFbcGqdL)fVNHBHoam-MGDv_ImF;+CDIZ>UbMPO2_+6}hTv%r!MYk1nj8SL=4yyS?fLYPZ#Iub*GPpgyJ!R)?u0)Zu|v z<<#-&G!2@DwM}b)U!UK2w&6^}wuXNiN*an9f}27BQ;{?+YFg5?s(D4TuGQ2!tTnSW zx;dfwY|E(@0^sj2+n%%`T9N;MeQN8B*6A(NS{hm!TduZUX$u7~x0qUPwBBy5X?M0$ zJL#QUIyM1p?U>#u?16?EEUEBVy>t$E#*RHS9ZejP( zZvSpZ7qx3r*VHcBH_Er&-}Zf5{&mq;-|xZSpM1aneZ}`x-{XJ8{fPJ;{yhXd{_8p2 zWBXC{Bk$|5uMfK(b@g`jb?xuo*Zt({ldlJU9QXmYLiFT+&;LH^*Qj4p!={AwB7PyR zq+Cjw9X}Ur4P_(*fhN&H_yQ2mCdHFuh%vXL?nX65H%1?dI~W%e8y7namJPGODq%UX znXzNy#>MGkv@v(0Zbw0)yrcNh?CAH=pMjHdH~L!4t(fmI-(sFcKZzDa$)Yw!t&VyO zdkMP?D}YS^eoQy49rh`*Br*Ut1V#g!h!bGZuu~ELMIc~FFgwf%J05vF@*3c@%;V#s-fK9TyrOmJl{PBq!vLkkujogl!Hx z5`HTDQrOurXGm>GX-H9sJVX()IAm$a#*nok(qLt9NJv14J;W7~9h?;$9TXjOA?RYz zhM@I9M}v+8jSe0Yd@lIE;J<@*1l9OE{H1&-Wt?=?SbdDPMa_8!|>Dq6k)9iVS9w*gMt5g)_jdPpPxw0ie;i!{d|P`PE|MI@YEyUX z*4egg+qP}nwry{n?d=YoS1UY84uax7+3)#vYn!z9yWjoeeILAsGr7avx14vJg-*Y7 ziffu{pmUJ399x>L=&a%l$mBhc*Q>uqnEUNIi z^!L)e%62RJvdo(@*`=~dtt!2;^xiW2%4{mVsk8yLi9XSgc(BC55_b~rBhW!ZxYTJXv1>DD#PmVmEnEE`-GPbs}MHSILIi)o=i7n7|!ZXLaE=c?_ua_ zIG{VIYocwcovNFti@=@IOxr*ktuC(qrAk)qS07OK*7niVs$Qd_1pPdW4F+@B#SgHuA&L(^xc%}G0*dMcGlBhx0OPD}lh@;$|$8k828 ze^DZ%WX7HJd+CuG#*7x}?a~iILrX=?)G(t##@LK88Mytluzk9CZ5OtDY0kH&sF?>yza;ZAb1POCGW z&*blf-U*$c9H;ctg>(h79Qh;iXXO3r_p6_-b*k3aipdqnRUBK?a==g zqON~e@omLg73v_p)}z8*@c0-^Q(g{yEc?DJUsi-~x>bd9<Iy zEVHUiXXJ!sB|}PHE_t)$zLMKfNlhquq~w8;FG{{HIVW*uVshfo#I%yXOU9N+C}AkB zD*i40PyDiCON!kne!Y0<;$@3(iQgE1E$&9#2;dP=1f)S9_!#pshKP~Hw1{dIl@M7h za#iG-$eK|#qLxK1jan1EK6+^EfY_d~{bQ#@kB>&+F6vdpi-^bJPs6vuLlI&MHa!V{ z7JkNb%Csh8T|~u*3K26RW=5lD~yHMMoMomK5sM^wjEVH$(RuC}XXYD(Qp)lJn$IY7Bt zwO-YRY0tcJy>R)z#*ND6%THW_)gJ>PbHvwvs5&;LIA`(Ldx{Wbm7AW!DN;hXU{=dU4ElX^AfM#|T}|NU*9(lO;r%KMakDMwQF{@wn! z!{07{$y8bD-_+F9RjDgdFQr{dYn0JAV-j*W$>~4Sm!!{6_hk4pzGQ#SPR&WpsgzSW z=MHN9_o%BH=GM>sk@G8OOzx=M9XUI5=4Q{$mgY)wkLR7pTL-+xEpsdHcHXhvqq(7Z zA$kAq5p$Z^Y{|1cf}f(Iy_7u_>sV`JY}*{W9GltAtjlheaYtG%nZySTf7tAXnvdyu{Fyzex) z4Q{Pl?Y`i;;#%OG6t0aWHMP%la&jv6y6o*`G~MlVY|b2g{8vK9%+a&L>M9s zbT}2>%GAm<$q3-go}ino^Xdit0R13+MQwR)pkCU58YvhUt{J9*+@bk{im0iov5HhN zsut>|>ecGC>RIZUsGxGxl{Dov-POI-^^~=gO%yE@zZE|eT@^hP*X5VxZ5169|0zBy zHYztN+X63`7tA<%Ed7*u&crEV6^rDHfq=Haa#qM7wBr*?3#HU1xu8du^*>t!9Na*eas-S>TxCIN>T;>SgL+wMiYJu8ni< zFRB1aBiA%kH&DlGW3}tFo3x`e!!@O~WwfV(G)=1JGFZf?x`(>c+Vk2k>W}K}s@>=< z+o;_dPBT_JPOH{&OOgutrZ6TMcx zM!r+AQ_)b~NWP2SK`*0LP(y+F^gQ}A{e?b89ih%r=cuYob*3KH>o@v4eS|s8JOeh< zTWCA!ARm$U$!2sbx&_^YUPo=Dyp#tFP=D$+nM4+&ICI^ zbG_><>n-Qf&!jstotf!5X*tz$s^(nDxt3GkT-RL2S`OW3o^^?Bp)JFjZEa?0VmV+r zWC^wvSy`*o`o{9wvfjMWe9e5-9H<{&nO~b%nOB;xn{Swxn^&0cTkcr?vwgE!?b%@9 zFW5KO*4WC~D%xJ#U)q1Lzt{!rJocLXh8%o*z}=1g+lc5ZiVcWrZScUEVsv7Mb=oRwS^ zUC-GUtk>ajsGS;TK=&Qt8s>62dFMjcJl9+I2e+J~xKZxW?nEw;Q}QZ)3%7}T#=YP| zg(991JRi#y=dQUgxvOzCxj*h-?n>?|?jhVDt|8x;FLe9ewcYjIcetBeS)rWZ zzxEQ|1(MAJdjVN*_c7AlSx;q6WBP0PZUgty0;{x0lgm@hoov?Y8^ z_#@*hV}wy_+-E#yd}h3FTxMKjTyI=u>|pF-bfYg0Hp0`tm=c}z2YV`vMS0-%2LWQ%4*8W%AtypsP?-mPAShTE8u&z6m=9;l~t7= zl<$@2!6!Xqo-nuRdx*|FrT5cE=q2<5I+aeR^O=0+t^AGrnf$qYH1_l;awHk+kMm!1 zUv+128C(^iD)^5Gu?kk9OR1Hz0sMQ@)P~5s|4e!E z``+*GzyJPD0O2+`WkkxT)M2R)(;maIR+x&B9%)C@kEHj@=$}zJvr^{r%vFdXCuiKs zNXpoqu`6SI`h@htw1Tux8J{xVWWCOsoHaeGVOE{2y4j7g^Rq;B(GRk$+2-t`oZwtb zZXRIC{gU%3$DCuy$;eI5b>yz#3}n4K4|`dE0FJT)V=-I2t$_I!2*tZ)a<5YhY_+yJEX!8*CqD4|qy1 zvKQH8$2Z3)#|TFi?5X3x2zD6z-tp1V-_g%e8v9V~R5|al57>_=FekdEfEQZq9_kwI zn(mzDJm@;)TIgQn?(A;w4h4D9+|}6i*7eb~j$6aI+%9*nE7v9Eq})$nHNTo)=Uwl0 z=R5N?=%L>gye$Z{!(B^vEB(97&oYrEqDx>XR|19@mYAM6Be8E{@5Iq1#+JC4a3P@} zAwQvC!k~m&$Vz@J_64cQm&Kxh-En*4yfI=-)7WOQ%j1^EO#$x4CB=1$?;20Ug~s)Z z9UOZi_DJm8n0GPDV^+kdVw5qFQBhH4qsm07W7IM4qTfY_MukSTifkQO4;}J$bi%c< z|As~mjjS3`HR5)}od^}?tZWG17JkEY!F0#;#FT7&XS`&%X{ceWYz%OyZ4509f!^0; zaAJ2CH@r9eXBcZ7Wvr^NrZ1*T(7n_@)5Bn;AE6ztEeG%#QS(#tUBhbx&120Yjb3Ze zZqjVhj8%3IAOcY1?i#NcuV|rcu3V&8thg<|Ex)I@r&yv~ zqP&G&Ge|yIzKB`KlwwLV`+(K*mGY(d*eTy4?;-CiuY-GNG&7z_p?{;onn?F$dNS)V ztM#(=qO~9^D0_iA?<;vQVy)*kOTyYa}$LAvUlv^5j zmHRTcCG=ruo;|M{)_-YpqWKEY4t*?Xky(y|H)2rh2iA5+dsllaM^nco`%U{C>trj7 z8jZAv+FLu?ITkw>I>Oj6_J!l6<1c)RLma~$6WKBBZu9~zoXwn9UDq(lrJqZMHQ(OV z*42mW&+Xv0aS6Z;_bt>_%iZtY|GD3~U%Pp?;BL${!aD|V$=o-t1>cNsEHoA7i*v*> zVtMftc-C3MY~dikj~~Df=Ew4*c#-qtPN~aJ;-~NxgbG40Ur(Pk$QD!!b3(@ljSp%? zv?j(xj*5Jq_%bm$;Y)%))*ss>x<&Np$RThlzlu~x$^UuQ7DO$IdIKN-19&!9{OdPM zM}(OoO--S%z5ws}C+t_))3E1ZQ^F>PT@Sw=KEyQ4)GWMl_*&cm3Ik(!t$(L~XuM~f z7q%cwVUQat=qu>c4e5q}*C$Q)M`wWP`IhdQE?t|Yt){D@8>$r5*sBM156DU0r=&`B<5wNLL(F zoKmDH|0v6<%c@5y$0%pWr^**&r78dk6T$>B62{HgnJe;}a+RExkHBiJLsh3{lk-VA zNt0K}YowLRqgaZk&Qm8Tn%2?@bQE2Mu0a>4i_vGPGt>xrG+m3S!OW%S(nG0X)GBg0 z*@Ns&z9Zj~2Z6Q3I^vJ?m-M*wq;#Kbk8GT5qO3kyhm0hn$#VH+^A*rWr(0%P%GgWW z;~nvilc;FsS!Y?>m^+v!=8exg3*?&%%`YrZEI%!&mJI73>jc|WTW4!KtJ-3)jI)fi zMA%|&Bke=%N9`x^|z8SqhX=i!o5_Taw z3w3|sEOxL?wjI{rGUswg{^%dgn?+KN{|ib_cort`)Aet|6}eu9EK3 zZVu<|6mA+9%}1fGkqJA5-NH;^3PwNF6;e^R*TlN3&)4Q%oPcq*1?~sj6D|b9ai57V z#ZSTqAs6#n%z#?Z2)+28yqs6?H-+oM2hT@Ob#D!CqPK*1rgyg2?8);y5g&_l#rfiU z@vX>-y!ZlWgIO;T&=mHGd&PI+2eFITK^!WM5_KMx$00gJlPBEs*!$R9&R@ZQ#(&yh z!k^&J@#cB^U=Q^4_wje~b@b%}5kZkbN~uEnPV!cAA>?AnB4QCS3mv6P=hC&pDvZ>I zYu~Frqh=_n%EWq`rkbc~s%oLytlFent6HP#fSP}ka-H%&WwNrZs=2DCvY&DgK0Ycx zD_3v(O7<)0uP+ zrWZPc?TnlDpvM1zPV^VOjowO+0j^Qksa{xRkBMhQF*25%N=}EOb$~2Km8O1Df2nEI zRO$kGo~%dJ3)s)7np7<+nfyw^7)#LMl6-^VW0hd3tw$~<785RHLT(fHi2g(`Vi~cTs7RC}`V##J9jPY| z5eEpf%qq*3<;X4pb!2sAEoCiaJ|NIb{KP(ZBz+)Fh7z$zwooR=tmcrA(2#qUwjvj0mb_2VKMF_?b%1YR+>=w4Zv%YhSYbz|PFWncpOWY2AJ6{echT7YY8v6^d z+`Y`b6CeXMJ3pGAgA;TJKaBr|*Al_fFLW(%eR6(wE^{tHM||4Z(bd6)1H=8m{m?yw zo6eO-Egx9JH-%e5EwP5!R_GuU=i~WXz*b?aa6mXHv=&+jnVgxc&sFE1@NY2Q=>?pk zEd)vk5kx+pU(c`Q+wiUVIKDW4ggeNsL@m>bZ^5_1PZ~tM*a|o;o)NEjE_DdtJ=d>6h66~v0-G|yB|dHlVGU&)()Fm8F$)l{3&CAAw(v z0rS{bby|5$xeR``wyM^u0O1t`*nz3)DeB$Oh|j1`sY~O0udk}Bnxvep^eMcGZHgTV zvpiR>l&j_cF&~(&s7i*TW_be6XAU!iVQ|_vQq)(RR-9AhVDA+&A@UW>QsyP|nmI2& zE1#^Grr3a<`x14Hil?HfYD_Jr7!$|*rvK1az$JB%ca$?UO;gxSjevFZS~`_UXD%}5 z86{8-hTA4gedZ}Tg%|W=nq=gR5Bu0p7tnXvMK;_Nwe<*~@cQ=S1e2@-Wmi zw>NMAOjCgWY@gdU_ifI*9K_o5x|q9|7r;$A#yrN{-P#>VF~)kqa=~)QddT{~`p_y` zcuNWf+6_b^pwJRxeTQCsyKSfKs{N8(W}|KEEGsO58fYtgaxS}IuVk-??}yrM+V0t= zfXfeZgg9`avUeRxj`og@j;?HHR*w4T7yFgH&pu;gosrH7Kp`9Kyym#*&^Qc^M79JQ ziBxiTwi}D_Fpj%;XQH#Xb1!>{U5qh^7%|;WfP*aW6s@ zsfyeYxi#`~#Lb90rfQ}K;QEJ$4++Qk<1o%38rB$A8VtrTbO9BON~6a3)cDY-2{VKp zF&;1m8zsj6hJJ>rz%6)yJ{i6mS{qxS_R<Lq%sOzZfsuMKDHI;yd>c(KY>cD}q zNZn4=MpakYKsj4AOVv%&RpU}~>Zi(w%J+)TiiJ2k&Z;k{3zUAPL%}LCl^IBPc2<6t ze~}{uBcCXrB+qC3%tv4nJsJGfQOZU+sM=Hwsxj3ZT-FK7O?t>F)CB6B^rCdXf1m%C z@KdObL9#DAPdvxHXT8T<2V6}tE#>sr6JK55UEinvnf|9kYP-}98J#i;GYSIHpmZ+H zg-k?pT2y*idOTbg9n#yTt1?s>o(ykB$;=X&`b8Zk^LI zXAAH>=SNP!cYQDSPVR=>ZMlbXcjX3|Npm)Me;4q;^4K!O+TU8yTHX4^^1;#(zE7vk zVQYgsYOZZIMs&P^do;^d2VRWr)=fwZ=&cK^^TF2suy#YweBXNS-}^bc$9~>%8XdwL zhndY~D?l}tJ89=U#{$P*c&v*Yg^u0qKDL#sxoe<%u={{(pX-9_lB*cB4_5eeZX);I{Sh5 z9pxUp%Pn`xZ^&=SqnSvifGVV1w2RJUGMHt|3MP(@pBV)*73>)_+q(O{I@*EPZ1}G z-`U^n<=hLo7jrJ>jLsXK*UsG9ya(s@NqGB%95P2hlX_-*ZX;}z?Xc|tn18=*vVF3> zw4)48;`WYUhs3eLzS_RbzRDipOPjIHu_CkCm+UKcnRBT#9=$*>cMtb^_a--n5ptc} zUEQg!6jyzBJ@-e~C#=g0t`A^j+PgZtRwH+?*1f^qglo)w;XZRW_}lynVF@Bj3aqlO z;zQx_KW-DFJpc8rld%343Co4SLSNw?UbBjMA|8W+f2+yj9r3zY2?N$S(IL9f0h|W! zzX>PvNz_H(fOnoZ9<5jJec-wG&$HFq)7EnuRnraBKFvL?J-1K=>BTVd7%<#37-Q8N zd%t=A^DgtQ_HOcQ@chK@aC^L-LB2k|XWrLdwO8TY1YGuA@s;u?`lTpfhk1v3v%EQ8 z(kJy*@K^F*E4Wq=*at_7P89Klj>3XaiDavCy^_=^bko!m)%{h2Ro7HkRC1LgJ1g5LAL1-rB%d$;uK1~#0z}Be<@cEf%wzD3HRRRs>Kl1Gd2{)A zW-1t!N?=qbF=gbX<%i`*t|%=Wo2X~WSwO_WIttJWe@QE zF8JyP>io&XWa1INHpsNHhFG`7fU45U(rtK-$$t1wH%qojo=F}{Zb0(|>G*I?H^XtMhqM;tZS%Ge?4Y~b!lbeD5ibyaY^a=mvg zhKhC2b=b8O{LNJ$cR(K?$Q9%o;~MR5J4jRKwZ9ESRuUQKA;2kx+idxp$2T^7ITZZj(k^MCn$w> zd?&sx{&@kO_!jm^FW?FPh`%IU6Kp~*{BxIue&~;{ayPjB!hY2BZNxNqAT)wPSc>26 zX5L2L`ranUKi}~s`DS}( z;2q7qUa!Zy*|)`4GQUKAWXBta+)$iW%_s4e^9(X+1xPqb6M zUp@exc_r+{BDw#chHwXWL0jy~W6V(|z=774H;^Bc@00Ih_A=AyDRe-CJIS12s?pWy zr_>WT?+Pf4&7d|@Tc}D*1*R#}f*C;%r5|E{uAo+eK{}25AsDJc5$__j8NfGT=eW=T(ANZiTspxs7>Y-u%4Fc~|nvn#&<|*3T^DdGc&|<~-V> zv}AynvRUkwm*@qySvJ8jeZ*43TG^TjZ4ZT&wFJ-)wbDS_02>F?uvfRAw4Juqwbiz* zw6C%EbaZ!M%(s1-eY(Azy{x?{`ulK)(Q(Cb%@Ht{^n*HZ$DU-bC*Nb*x9$g~l zi}_QDY;=L@FZXk$8|9dW7E*FCw2uK8bi9 zp)e7qHKxs`?WTPD#V zooWH2IjU&pX%=XH0}p`&K(ErN8YvnpO5rB!i{AVo>ZLb8b#Sglsv^}+=}+`GdJ#2`+DYyqOA^J2VZ=yc zFSU!xCCo%55kcH19uVt1Ydx{4@u_7oQ|=A?LNOUp8Ras|XU+gFreDNF>U!yCGR|h0 zkeTnE)ibM9X35M)8ILpSWY)?YlQ|)CQr6h4j@jL^S7a~E{t1szg}jP+(%g{T-r4=L zw`8x+UY)Zs=LYuDoZN-EtIW&HMM%)sHrGU-kYlcGsb#5w&tCyO&`Zy@&aoPSg_Z>t z(d;pAvuw45pf}F4WkSvVZo7>xxjhu>5cJ3`!EB}4)8Q;igsWo_c-zem(ZM^~fX96Y z4cftq><{)6Qk>OThNa;$?ZpPMA#4cJ1v6aJT??Iyog1ASoYUM>-CN-~m4Lym16{d1 z?!90@?qXc;pt3y!Lp+Kd$KG??c6?#KvxH0H+6v8E>5{u@K%Z{Ux95#enTvtf62awm zN1uERchgDXgfNMp3ZAzre}+HL$AE9zE$kCC;9m!0{rB_q^ZfMx@ZW*Ipb7fQLF&Qk zLGY0!>F()VCe~CZvVLS|QwLLzu-;+k45tl!_5Jl@fY#8r!i|x}p2qIRWJ5AKgZ6Nz z(T02ayLvnfNM9M+!3}f=$@;JQHu~0jUMK1r;1ww{Ft@=$1#L_KrskoAxp{!&;#gwz-QD|^O<=J z!zh@w%xdN*^Bc_43nmsUlA2c15=utZB&&nL?Mc=GHycewQD?!|wxilmR{?^eaL%tJ zHI#vRL%pE#(RT#C-;wM<{*nEW)go#W3yAqdaanQMe(6E!3F#53UE-4bkbIRCNhH!m zsF@~7XG+@yHw{k9&(5z_P^BOY&;9FLIIyr%LD_}4Q@P5r0y#h7m zvrzf`h64$n0X*~vP_w4jE^ECGOJ%ye&zE-}qzIDDA z-sj#{zScf6pUCeH{Pz9z<#;o^k-j+JZ-kV5{(S$$f(Zq6fDifq<(CXC9@-l#<{au5 ztujKnR54#+hv(<7>Zhukx~IA=lI&`nvrAE-$P`k=1jQtUR2c%_|8zJJswtl+9x7I# zgFP-kB+q2>m`o;>3CDb(5DgeApIo! zAR9|eAhKndvaPc1vc^OsoYW>lDwD~MNsmecH9umG(k{S!RQWd~w(r$q3C39gAm1-U>|$#c)~4@6bP?i0_A#4lNZL zEs2&S;rj=I4+RIj^sL|MU*TWwukUZ*f98Mc5B7!nHlnLt>{#S*OvGwwLfzy!WJR_I0UJokbB#5aJ})mCVaDqbP9f)}Sbc>ACHcXZKuYyXe2fitHJLxL>wT}Sl?C-&X*Qtu$Vn>zm`#`E~x``6Kd+6~q_xE$Cm+9{HY{h4l&pdc!o` z9Nj71QQaJ{i)+*?!90#qPf(3hg{q{gY|Mcuu8PIyjOrEE|2y!ARWaBCL?|kbUCM3B zt#E9XL~nijU!BoZ-VoGCA=3zR2UdZ{UkcT?Gjd`9o$aLJ49@Plihby!bLE-x=8Bez zp^9Os`HN#uospa52KjI39(Clk(VH&@)89^>C@+iOu}GdHH^bquQ64N0l~<6L!xhRi zsn7&UVV{_2Bi)Z4_^*yxL$9azQM;+j&<`@HH0lm{7iuz1t|ixyX=FNSBQ0c8@SI(M zx8!T`6ZwVQ4Idp%Gf?-&(L3SUlR{fy2^-Ok>P|(2XL?0Fr>a7Cc2Q2~c{SkR+d|E! zW>E*oqvQ$V2zF2;s-IEB9AYL>1NXxkVkH#3vxJsV5&dO@WX)wwWTnuhUjm=HNVY^) zmPjO4$=1vK=?4mI27eu2JzJvghb?r!c3 zcbfY+cZxgaKJ4D*+T+@V8frebfNKB`MtiO`_Z~a>41bJ|7fM3OE9Bb?orOQ(sGkcj zg=Of>4?_LxCG-(?^4p+1?&ha}-x@DY5o_QkIt<_ICSkL12v{sG5Fh%U`2wEq#vx5Y zZWP`uoQ(dhLRjT6qPVm;6-URNh&&eg+4R-)Gwf&B*03%3*cR3eF1jJ%L&H~vuLy4w z-XUCLVob}!*C8Vu5tfU*ynvZMJM_pT82CCb7 z_=xUnk~BM^#05Oq91x?4)zs6}h1U06-41@)JhfF_6Ta;_=qoy@x~QtEDyc3juPN^< z?kcv!(^?h&yN}8*%J29%uehjKik+4O=oLD}Vfj(HO`a$Jr1*5`r9mK8gq|+NUsJfb`e1Eg}OuC z!k-!V^Coo!`)4n)o9IAvA-c;t%9_gB$T|~k2u)FV(H`4Y+y2aBnRRlj<~A|6GE1|A zva6-nPFJPV=_@kUWc-A-mJR1zWz1@+0Pj$#ypnkhF+1X9&WW5Z@EUDJhrs5zav&1r zDS!mb(%Nd?Y#wSEZb>z#n3n*&SukI)oU=TFzvF}Don<{Tn+eE~O}0(2`K*Q3&zLLG z(%Ra3!gd@E6@$^L;> z)*t)GYPVruO~V|Q6Ko^+j?Q78iwl=YDQAN7x$7kuu(vJ)Tpp=V5Ds9yUje6ehC9P` z=X!GCZll|aeCAhZ;+JsqjpfI~t3mT0pfS7wmU7FuRPGPghVQ_yK`o|6X6+64lH14c z=hq5rg~mc7p&DEv7-A|`2F$#b&*igtH5gfkXcpIaHhQ*r)_J_(dhDF*Ty{lyMOiMgY@{@nh~*=>$o=SoKN~+8Z|ZO9DFb2P^&Y((eL_WO z(tGuL_5GlSZ36O;c@IKY^v9ow{l)}L6xh_Q65tq z2fGvtmuY3iHTiY{6CmX{3I?Dmxw@C>LN6WZQzs25><#v0Ubj2 z8BA>l*)3_3^oKNA+DzI~dNcHTXyCcniV#&ugWx*B2ZN8{S=gt8L%cHYb?a4YdR}_o zZ}^aA+Gg0Q0_$uWpe2a5G0=BkV`fkwd+^Kg!!gM*1rCkCRG|cTqjpXQ#1~*st(|(&%5?I9oX-crHO0eAzA7w(NUo4oZC944lp@=WFL))c##st zlHyumIxrO8iiVyBsG?SSW_YG~#)DPOf&bmZEyk4ZR$E%wPHfbAfq;EKFdneWX560bVi+ z8dx!=IMa>k3U5PT{oMiEvWLpTS;`|%5KI@MR*9ug!z*`|JVy=!H+hk~K;qgUn-EQi zYs7V;3E2pKr5VU0+#}=3666iy3K2|7Nf&%bHhg#q5AhE8OQaC>h&sd(*>U)hnh|4( zNyJ|$57_F&c=QjuWjke?rCX%8fu^W#hR6oU=0GpIF1vs~SIGQQ5enM}X};7C$I(OS zYM`&Qk2Fbg7fL}B$zjPc$w=vN=~U@-X-R2u=`H9FTqqa1KXhMc_s|}p(?X_%%nX?m z(l)eJ=;_dNp)*6LgjNly9kQ%wQPHG=DFsP|cM4AyoGjSE?c`Xi9Xa3)wn>ih4jD_b zEuAfp@;dLF?wsMQf(&qLcWd`?pfT9QMOcq*Q`>kRLoJ#Roq1#vXoiQ497kR|(|;HR2xr6*m zq!KTQC%6}G6AjTZoFlFh&Bz91MY0-skGMnJk=>P52j<9TVt2Kc{gHf!TTcVMZi8fi zWRRqUq__lO$j~E2hl@5sD~<8SdYyiUzcsWcJm$pGE3;>2ZA`AHn^!xphoz_GEOPcR zkXgT4K3S6BeQ1iDZ*yBq+h*G)%%px~W03(~WL;)mWSff~L1}M>ELtEhu?@Uudq)Sy zO5ikLv0Lpu(J8zFhB$_T;os(X?0AMmPmZG<+lgJzu3=-qHSJ<|vcH_a{&|U-uua&b zz#QZ!H#s*u>pE*Y+c?`fpE;j8!!ezuB6Pq2!IXrIaa(sA_iWdE*FD#5*L?Rv_gwcJ zw}^|Q1-?HN8J#QKHO>TdMt1)&cZ3_`9_!9>Ww>;l0m{K(E){)4jyu~8LD_BKbpQH= zBY0;Wz7C(lr9dYP;U^1|pmE<7KJcHx6`bH};11d@Y(SqMEo8uzG##A59e4@_=m}At z2=wd`-lpD$-rvZ`mGzYJ=saPbzn&kS%HHbey?^-Z$T(c^o%3N#bAGb?n>;NtB{Dv$ zM3g+72>%67#*>JL5pN^jN7RX^9kJQ8#ndUhV}MdHZZd8*9tK)NGq?}0#&*LN!vw=5 zLuKFtaL;hx5T}pUFN9XtO5a?6S$_pdy65`0`j`6U`qldN`n7tDF-N|*r2dcgkM<0* zb90f}xrd&>p>b*owfWjWzUQRwh%QB&uI;7mp`D?bsR>pGsWmD+CRnsmg{vdMysFhV zz`MT3%!@=-X;qr?uQHHBevOBWuTiZ=*U(M1Te(BoQ`rZT(=IAUDo4TJovrXG{ED}V zH;P?~J&O0r*Gjv}rOH&MDFc1_Q~6{06~&c*{Fw%Mx-IB6E}{3Yps1>-FRvqi&Aer% z%BRS0qVDQMcc3@Wo9JMske-c9-9BnB^^HoV(&;QH>=(d|eWwlsGVHNxWNqjZd&sg> z1eWi;I_C%I$73)%E|6Oo`FF(M(Dab> zSD9}!BXh#x#ft)>^Y-TM$!(I`7}?|9$k6Z0$;-9oCgt5h>a$%Qixk2j%K*zn%VbM& zWa#yla7&Ik(_F$*($dP(+G2su@WK2AJ;fl)VCxVoteCb6Kr`&Ghwyq7pe`G18;Pj} zQMRA9-?pYu*PP&Vo1#Yw-+p0HO`BkdjTr9jr}E5txQoHf?jd%eL-MZzOGGWQ7P%A-aF>jgH78mU9nnF*mc4;% zqpd7SdRO{N@@=X*XfmnJrfy~*ByYVZ^Z`)%xW=Va#~6Z#3g zk%Axvqi7I!io3-v;wEv1I1BEjiRc)fiqpiYqEm3eo6$miAU+XEPpGE_d`jW)Ed}`J zYu;<#fdCE_-(lZTUkYlZKE45{trp{MjrV?rPn+_}z1h$fVtvJYD%4#xKGMDE-nMuS z^bG$@e{+8`|3mL1uMf_QfOo0DTi|7Vc3)gkLQ(tBmZ5(`GDAKGeF!QB-KdhPifSD4 zmh~`Or~v2aZuxHc1JwH-Mr3k<2xtoZ<^ALr;A$R^y5&3bgXzR{U}oTiTtlx!_5YGy zh6Lmu)cQu?PND#LgMrRm!Gox!U8S9+Dydd_U2+w_qnBh+=#tRXkiQ`( zLQaN6ghqtk2)Q0IJ%46?J+2O?cN^TGk@;Ly4I5k=U1gCwVBJpi2$i@%z9xt-;Oe87 zZG<$ysqj6C0!NT;N#(KJlQqPuL@bi_v07Pb<%EC|phP+759S7{@7M zEl*8PHRxYo#s9=!p8lR7k59bu&t-R4*e&iyZ<~We%`5Sf_)%1N)JPP>dse{vISlgdd+v!o8-Okz2j}|ZRfq@x#*$2w6~YHk9Qip zMR)L8px%e|$-B+B-M1B9p_#rJKC6%QS$tVo3 zk5zvGzi&3ae;u{@C#>;+#x{x^K~_UHZ7NU)HOL;!@!F4*J4Kcu+acQ`+l{XRS)jm- ziVPwR$)Fd+T&MxLL>_Sz`oLaf&#uF>w;FEK5l{-21~dR59JmASr;fC?)F=&untVXo zU)EnX5Sqaj=_YAKX%#694^oXxB`YtjByB2fBy9jEUwv64nMIln4| zvV+)wUtz6tjkB?<2@=5#U4!uKn#)iOUSY;!BWMAOoU8F#ZM@pb)fctNDnRC@-TP6S z1o+UM_<6lc=Zb|QU~}f7bH5BtVUf#&oX{F1a>|2W3i$SZq3d4iUg3TV&h#X>sK!Y3 z4CO{}v$z@De(nIWmJRr)xHEY0Or?U*37`W0~*zrA~&FzAA-4%Uw;7-XB zGsO<*suu$baS~hyvVpgr_nudt=jg@L;eJ^KR%!;i^W1-Dg&jOrV|Ze#cuRZh`XC1m;}d2)h~9&)CP9tpBc`s-L1i1#~rZGYm2eFnogdq9n4% z1Mt-g-E*A}-k}^|K5GAI+UeS{z;HmWWwb?b7Ey3rSTtr$KW#s4Nz6a4si~nU0Y6cD zO-H0V2WteiN1d)pQ+34bMvP7l#E&um?v<(#o}#U)&8iqwP8Q7TlBj4*b_`J!DMFQH zpx7N!98u&da!@t3f%+Y+m@l6tUk4sw7iy#u@MElo_7|vuD#3G2f)BH`#bbk z=+MI9g-!As=I<{&SXeK=Zhj)XKJ!x-VtQ$_R6f&_`6>H-cB#B_c?ZmU;lOKezF_6{PI*d?>az1=w}~nziq#2uk5IWME+|`ze~e@i*h94 zyJsBd90JR;lc9@mb8d0k(Fv@C?l##q169{x7wIP5?~%p7hdHN*z;S(X{|ANOll!mx zxBH;`5LCCz;A?Lnfs=*%&FW5e|8#SlgFA^1cqTs$YWios2w2K5;Vbi1kcwN!v%C${ zFP!{KsA`i?No^Ch!Qt9PC?{4B%Zug26F|V1aaFt`=7PTs@KPiSkB-+R(2?0xEa?D2~Q;uz0pPf75y>%42d)xpk&$bw`O4O0wuL1S2|39;P-bjL~?OK^c9beiu4{le*)&iTcUM(5-wtQm^J4#r!+G(v+%|-P^^=4oz&>J|bI;#?uqB0Kv z@vVHJe5S0285UDjlQBjhUO7ZDP@(_FV(FCuErC{0|8$0Qd5XM19t0g>F>3$e(6n>p z0UcbW)G0eD+9InzTy9}^zc zTtt>fBJCXfNO`~t-~@Rb%EAh=2CB3FIXVmQD$lHoCb{kwhu|9Aic?^4cZ$2aLxBRt zwMc>D?(R^e6e#ZQ8Y1`Rx=YBcFLR!xA;~cF&;QAL&fa^Srt%i@Z2WajsY`l8a$RzW zGnADc;39LR8q90&OYcaPG7a;ibJFLM*ODZh-)&GBK1$w8GI*1?IE@{XoRo}~jNnbu zP;!*|hgnl0vJLHXTIC3S=#Soa-bTz2rOZAzS=L*sWz@=ek@*Pxgw=e)ddzwP2C3a) zbJVBq+wb#csBiCJ??|W6&Ayplb}zj{0T?bWerKuU564_GVhx;)oyo2QoN<#~9jWim z@6ffbI5V7?&YMhvg3bWP^PsD}yN!E|YaMBZ$F9EazV4T;IE5YqYh4u(t+YU*?W*|x)dnKOs8$IDOYM&(#w~FcY^o%U!rlaYOo3? zs&T<%oUuyq`>QyWEekCPeF%OEdO2Sm4jl<~qiCvwHA1yQXF{jQIsX#w6z&{WhNXEY zq9&1sk$jPq$cpfaaE);FaKT8yNLwnK9${~IXZYVAH-A`jGjl8bsQP1U^w{WX_@0Lu zhZ{%gN9b$lYSP0F(M{L>rj0Opxk$ZLzf*ruy;B`mol^M-#y+P@xXiP(6FTicRX`8uj-RjyK|RNz5Mh9}fTnNOLZT%lN_kkAptD&kSK{#KO4 zo74r?&?n^=)QAttTlgOmIZypehPfr@sjKn}q-k_=GhQPx`hi(ykqwablSQOIq|3?N zv&KjkOYK2FNTWnDiL98cFxO~p*<3Q-pQ$B0k99JoY_@d1be&|CBuSDV=iF3@LaLJ5 zBsNY$nAK{eFO+DMVsXVNnTD zb#Z0!f1*1grARIsAQ~td7&RaYAX+fPlkVB!+u^&(DLq1$+8FP`Kd!5;v+mPwJH5hP z?``jPJOvB!4&C=XAy<>-J?p*1(=Y-+j)h*AqIt@7a5vG_=83XIZ2WQ zPXbSv{oe|_q8gACc#8(Ggp)@~Fe$h>xFgs$)G}0<{5^+_(B{yV&~Us#e+JhEn^32y z?ZIuqjr`_`;8ChbCo8_rd;W-m1|Th$p1FuIV)9}m3Gqm_vsnVqpQ8+ z^EsuHteBeo@G|8eI7YkSv#X4Us5npLSmh!-&rA8R5|Uj&7m-2&`6~V)70j&|MJ`X@ zHu6XEJM#OA$BJ=^v5M2^0Bz;%(bUGvH_JE4O=S9y$&TRtIlw7@2u`3{IPB`?&20`! z_ew`e$4X<#oSl)K=ZSqzHjN(PC#pRYoI>0oi?|mqlkxdNEs`#jE|xBp{)7%7^vXJ^ zhD6U>@;#TyuRW3UlJt}eq;}xjn<1Sl{g3(20lI9zG>5<8g4D{>einDsbF_mQ;%Qg84myE$ z_doX+*JoD|GH^?%pUDMuBNrt2RG+(Fv1aifRD)R%h%#L3@Cp_8l<*wFLm~M7l3{eE z@L9v$=`Y+sbI8HHpl*ml5g0OTF?MXU64P4}11K11~VE14~;5!+hCcKF%1drg9H8K-Op^D}d z%egGMEE$EXKq`?-1Xe~_Q>v*Ztl$5VZX`uP*xnhplbla&(-Pw%<4Bl}mrZ}OBB6Bb zFR|TX)v-#5@6oY|rg+nISi4OP&GI}&J75Fk>T~s(xP|)Z`{+~j1@(9JxA{(#;UT-7 z%zQtV{LfSUV|`hDd3{J1(7o2ZVS-gj_fq>xYv#<9OIfuxl6L2`tF$Y%?X(@VHnN`E zHM<}f&Bj6WO7oNUC+#s*fHY>Mmzk^PupN5h6Zm?I zRSQ+cG$k}OG(Y9d$r9Dc>Vf!cgCzR9!RatlXH{qDDTZ^pYN%?VY^_|!`)spvt8zIG z@MWsys(RD_7QkalS~X`WJ8b;q-p}Jk3ViG@ znV(^NnKR87JHWchW(cP0ltoCG6v6~%uGNbUrKN8CCjjfGuwQ=?&xXwshL8+F8e*nI^yM?E~_ zO*o-Fr2~1vxosgm{CH{yc&-%D;HZi_Lb=c2?n2Ov1zI4mhnI10`8l# zrZQ*`1x;y&G(&&tHnrTa!f;vtw|<9iug-yXovJIx_NM{5n{0i$#of}((AcmS7RDmo z0^JI(|7B3(Z)k67cWAfg-48B}m#e%yTX1HhV7Jx`L@jutzOCK~BWac950tXwC=hNo zDf~~f6!qXQ(r=Tf19(hQR0W_(Zliy`#Wf#4{^!oUQqJ*ru%!UB&nnQr4g&ewtR-XtMv$vt>K-s1UC z%4PC@m|@+O-i000SUN&FTDn!bSt?{mFVIt*paw~YNKeo=^h96iCGH{CM;oFS{Fwh^ zOw_ojF;OF<+Iu^DHJS3v#PpQ(gD`xLSx#Ao;gJ(E^k;a1$iQ8&jn z$5sTN5|MFxaqM?N=ayRGEkFU5dyM-L-89LvF?)qd#Q#r96bzg-DISTEd4|;;&@A%I7F3XeY zxr9IbDCP1vJ&nChNqK(piqRA{;vrpwhxD5F3a7aPbj21g0WV*1v@n7FaucRf5xh#d zelZzohhG;k1pY#UC`a!x9Q|P{UwiyP|Jc9?=0tNzd6IX)+d;d@=a2r+q#p(bhLeq0 zAIJ{cf>W5%Uci*UQ}%<$y!FU)9L zMVdy+ge!!VQL?BGoZHXg@$8O%P*Yt){XbnJ-5h)wQPh6j0o`7hE~PYOH8GkTp20C1 zg<7J%uX?E3qu!(Tsl9ZxU(^rP_fctUs}HIUstT}^U>knzwaj)ZDywpux~+VwdZE&h zulcC>#7XF>q7`Q^1AW98#ckegV^ACfCfEN^vsU7r7JPKg zc?Ms`S+Pd3PBB+L7tJdgjiP>@_SHw$mmb%_>1U~QGL;X1^+VYsSpv`KswfoWWRqYW zrAarUKRiUcxXtw{%u~ywIy99wqgs&K*GTtD4v<#p1pVuPqy^s_f#%O@k-JVH`(Ab4`0SAagI15{whin{T+2Ks$@=T&i(M+a5xf)gz=dj=Gh2_(|*En z+#zFDGtx5x9?^f^>f~gS$!;Ab!&Q;V%SP`e?`YD0l{p-|ya!O%W<0AI=PT+Pek{14aN?og>viO|{LS$JRFxsLmUMG%ftt9nG z9ndYS7czyJjQ0-NOFe)dd7)|vs@o;Bwa%&?f|(_a=Q_WMhEP^knv;l5_8(-5 zkFbD;$_B|MlQCE&TP=Ic{jh>+fVZ!*tfI^hBS4^k-J}obBkjS}-jaMlSo#e`Lh$o} zpg^fuMQ?Cf>K6QYXvELO@5E>6qbJfoyugdPpAOEe7O#$3AG0mI zF)Uou{Q`XhH-i5KzkAX=1#Jaw>$BHqpM@1%MaWUYU12?i(*X}p;4^+8z1Ggr)=|t^ z+*y?KNNuW;tFr5g>ym2(+2FzML2if33Bj?u%jk-QA26Gf$wwGr3b^i@Ng8){kK=8z z1RBOo(gk(!04>McAmslAy-$xnXohE+rx$O6Z{DvYiPxbq55k>##oLid=fA$IzJDk! zdvvzqeKh%k%kgrId2K_4pfa*A|XVYW+PMXNh`(O%6bhJOl zU)Nt7GM?M-3^)Q^m@h4-N6$q4YfBcW2el66x(A-Y2UKdHEO|K-cW8mYe@vz}(4n)M zEYv?VAoM)=EciR`5g|9%E7%LIZxR#Mp~2nc=2oE<9;Spot!JnQsh{bgr{O2z9r(oV zM?H*M`eX5rb!;398N)^~VrZj;#tEQtV)H?SPob{F{sRGKBpjGAvD0Fw#-67BrUYa3 zanmu=Gt+ZZH&a*Be!NEgjQt@5sEzdu4GfF)^Yl;jFX$HT!THXouRxz5WD?Nsfr@V}hAhl=70981+B zzdVi%XcqlMBTYk%USrgh(U#Hnz>n09JyfsNFV)>Oy)*^c;rU$iS~CMr#xKmkf@GER z;hAkgb)?o%F>ItNOz{X+e#e=253lPWPC;FGBMpTWvw+-ZJu06fA9yh(?%Ns4*NS(F zYP@x(qv$2V?)w=X-7K@ox|1O7!TD*oY&Y)MQL;_Ei}G{dX2{LB{nF_u>dW)fHB?4Z z7iIwgNl0=`dPrJ~d%Dq&pMP|)cd^gOnw8bj+JW408{21kg-_o;eXH@U=C}80@6tj% zWWPiG9g;O5E0blItuvctu3I^mircUwl=#Q%lS?1eRDfX|eX;>+eCiB z$60GOyh=& zA20YS<#o#4e7E!cmN+Xh5buv)&)x(te!bXuL;Uvmo$=EXeoYui9fYS{D!y3!pK%-F zYQ_D8kEt_AM`>JX`t5jAqN$CsrLi!ITMC@)EykV38m6kITtkd;i+(ekrta&98ipCR zljnI3A9$@{mEkadv(-3;9gne0>eo4w1+aNt#>&(6|jY7giR>i&VYu^m2Nacxm( zH!JWkZPI$_8?I^oBPo4c^Mq{Pbac4YQ225+KQuB@tn2WWl+~2h_|-wR7k%wGwVrxG zZb!(UitxeK#WkW;Xcf=lR0{uWfnxp|cI9)t=jHH%98m00+*dwP7FQL9wK`MThPT}b z`AK;UQ?U>7kMdl+Atz;L`5a)Ym5+DSL~vC((jv0r{I9%ARzj94>mltbO_!Rb1324t zly;WB5x){|fb(12l=sw!^v`&R0!q8*3|TPkLuL!{gevIyNbF#&(+Q{%Si?mtEqJ zIF2|DITq0Ms<>8vMVIL1?B*=yDj{qThc>^)Rhoo;I(kC`X1v)Va4ps>whPpvHi{zc?V3@EqoU8s8!)w#_?PAnHxC+Hu{9Y zdHO@|Kp&>OZv#5=r4s_R0G* z;oAO%C+}(UKql%7oZq5civ_8%+A*jTv&q#gX6spsriiwXwx4zYy8}yVhQf|GsNP3s zk%mLAui8Mq#)Nk|mZ_^8J?tFw8zFP^jCs#y)kd7#EnrpbP&QRHrt7_{+JI90v#P$T zB$L|yoVz3hI(L#eYee6%m`P3{=Cln^Co1F7*e2g1pM{PlC&zDKZhKaKPQIP$Mv?CM1$gEja~2vS87a9BmsaR=yOM|AB|d=E zA(qrZfjG!>{I2A-MAN5T_$=_)WWCjNAP%2&3o`q+@jf);T3v<%??1Rlxb`N@bvIBYG!y? zWMHHT-R_9+VAO)QVHvsqGU3wU$D!w;A)Jm}K_BO&#E_f*VKV2UD}gI`HvS3#(+$lF z&qIMY7j8|p4|NDV4n7R-qi+bJirzVA|m7dQ0Vt<@4}%4uGf<;91%MU-KZk z4T~aMae)MZzziNhF7G8?zON*jOUg^jkCGsmF8>WL)Is@L@|0s`V`Qb6T|S2`9EbYw z2OWc)*^a;gPL-A>`@dfLMEZb!!GWgmTq>6;@e^fBIzbM@IV9Q5HM)f>^)CIb61Px6 zaenc7p4Lh5jY><(OLE0wu|lGj2tDs4Tzi%2rhkz3k?}VrLKOJQmH$BUSh7sIL@NB> zQjrejuJkspz(GV&{NM&;(s*es%5-P?^@dX6?-Y1sUFpI{(xVrXm6AF6?@=haWc1$1 z_Q-*p!#SbcVD4n*9RfE<=g>G(on_hRbQSMVoU14`!#UlV!zRBP?&@$xH@IaUDX05i z$?o)mFs$};fXO%)E?#F>C!7<%yGFT2=P}2GUST&3(&3yt{`Fk-l=YS4EZ>vo_F||j z#l3BrWzJwfrrZCCuxlEjX zFqb;d*{64KP_SdLbub)=LRm;9^Yb()2}OrqK@r#=*dO3xg!*UpC&KP-#`_65A?mK~ zp6*!OvAFNdLU-%;>bse`nBK>J%=2ltjBOd)$kfP`$oVGM5Y1)-qj9)lwBaZo?8%(| z$FgU$lD-Pm(x0K2*46i6r=O57NMlc|4|8E@T~S>fZ9|;c`?ZgC&-rP0-B|5-?E-2p zyAFhNPGe|dMtB^jIo&7$$Jf=?VjIX)?LFAu3KsQDgUeBh?9c%C!a`no4<7@_1PMI( zU!aGbVgE=&7=A{+^8n(WiK$gfe6-i0{B>l4T2@twoKORmP3fll-=Mq<7pyGz%>>z0 z*)w{B0It?2Oqe!MbGVMh@+kRxJW2oKZPSz9zaVd(qP%+qZ{QU9RQXk?N6XO=D&jXP zj-I!jv(ICcgpSa?521yRME}d;6toGyAOR#iwGo*{u8|A-eAGCTx&aCE#JJ($-vv}sNFWbND{d(x@uCy&_57M8eYs?C>!4hl9&H9nG zAZvcsr>rko`OHb??$m4ZJM*ucqk>tvuRM(N$w!qZYH>b{&3886edk6dv(W8 zbnQ;^{ym%n(=|OayEB9pej47I)7u6RVVhCE+s2e8&0^ed-I1g zD$hT@lO0wQ;q-0xY$w;wP1pjM#Gy$2VU4;h;;vNOkhX*CA`n7Q@!yeNiox>F|o4vv;BL}^MrlFzoOA~ zCYyH|pI>QGK3Vwm9t9o+v=MFO<&RfCu0{TVv6q<>qxqr!mOmqZ!2Koh{8%fLE;nXz}$88*WXrWK245LzD=FLG9 z_wdd-!+Yot-c+6FfotOlX`yThZ|?@Xoj0?6;TJw{r8Dk*00vp)FSI*tFUAIqV2rxPupL%PB6e;*xuS8Vc4;dLFXFn zNOHuXWbZ~J`^_2SR5-6YE;&j&E1+i2bXIfKay51R&m~;T&tNaz!})rTv)XQ$*b7{X zT+`fBnN!`r!Ku6vH@5rtl;Z3oMo&b6b=cF+t9|i~eF{@p|X{!z=u+=b!pM;); z1aEiwNConqJtJo#CnB|Sf6nbJYAebT+r>*_=EoF+b65g5Y2lshYLnRE{Yv?XE4B*0|a zrrCnSZl>lDEbHUigW7py(ERZ1_GMX~{s9rG`@j$%__8 z8M}*4aaH**)b|`^TQX+CT=xf=h%`#rwKjs?AxD(QmE&Nz3jAO*CoCZ|(Gp$aI)2iw zT-%56a#-;)RY4^aSV}_QkV74Zy|jzxx!_xDN8OO#;<^5v&-bJ?(G?a*7ID@eO6qwL zQ_)1pZW7PW=yyLdZ{1DhFd2PDLi(d5ot|M5$%nN#pC(Egpey_;nkHhwlBhEJ!y3^_ zHi?NvZqRZu{4>8OpQxeef5d}iF`c42L}$ii$GpY6ZFjrfi|q65tLb5d4CP7ZDNaXa zNm|x)R;PASS-2zm(mND(7jOsg+UZ>ePEJO+i#6SUGoN|NOh@1_I_Z3;ki2Y)&rZ<8 z{^0t2>3QrK$$aKtuE|HtJJZNX-uB)h6EU5CUiVJpdApF0Vmy5fOiXXHYoQZf!fD=F zT)*pmef+~X-4tiP;3J;{uV`gFctibz(RvU1g^a%!y`mt!#5YbLHqIbV121?^i-HFN zhXNgN;|Vj)7qGC01P2Ch2k-IqQz&53!Pa=2hCw?@2*sl$v?bH9J2WypJUk>aEV7kK zi6lq5hI@t|h3=Bnd>=C7R}y|lIP-7Bb96F%JiM4n2^R>zh8OlI{4o3?@{;6p&&Y4# zS@Z$jBPVi>=ZvGi!*VN-laezsXH?GSoJ~2?DVBcc{*V8UjKbN2#gJ}pgrtYEyHfB| zG{IqUfU`|O`ry)K`|1t%R>ISCX|5Y>Za=5sy(W5EXMr} z-=3hYv8X~Z4<(`pHI?koDpcLy$^R5l2Bsq#w`igK+TX2~P*f zZ}h}nQH#HeKZ)1jFM7gte@c8t{41WMV)%@@L+|7BB3|m9k+TEdH(8@YWIZHcxac(INyRYd7qq?r@D9$1j=JReT-Nnz4^2*{xnopk)<&MGm@W8#p zv)ePlGnV~3V$XG`#c$a)IM?$#yH19C)#%EPxsMjpEo72t6Fh@w1im-HZK;{5d#YH!=$y zjIR7X@EVWND<(dI!n~H`n=~*1@8F;QwfJB!p&yRoP8{qPn2|kkYImXb2KEGmy*}TV z24s+4=#78-7e0p4Llg;?2xif<6oWA!@XQW#k9Oy0Cn$kQ+&ijwlyI%CgD}LAR^@=< z9x???3lo+kREjSj|2Fo0?0D07Q;t5&dFGA&tnrjFL{_;M_0;&-m})9#%E$clf2PK4 zpc0u@8vig}QSO4(q2Q#eP>^^Nu4by>RoyC!$$I+Yax~inTDtI8`X8y@YBxFHlW5Zy(*zCqCKEFfs)V>ouM_< z7$tqh5cL7hMI)e4w$!x3t5i|*6urT$N{8o{OoDkVcX0)E1FAOl7C&xTRVsXrn@T@C z4=*~yZ0=YwjNw$AhC-f6gfDR;y~e+sr;Io={0fhvuX3PrAUS3~?BU7y3QNKt7|TAa z0QAX)=!Ob~O7T|yT7H~+{F&kjxrlG_CY+~A(yP>_Dp7~vjm^Vddxv+>E7*H!Iq5lj zb9Uv7%pIG%i49Q+>G{)>*j;jgZG|houl{~2{YZM5%u1QnGb?ARGxeD@`Kkw1EVD$W z6|Pd5%yO9{GKXh2%W9tWFzW$|L#eDbS*^1yEDvo#BH{}5*!;-6)x6!j#k|pMvcy}~ zX0OS<1$%6*b)B`UwGxh{bI?`4!Wyp2sjD$(uJ6=0+)PufU9Fw1+aTe;$Io<=`bN#O z&9&{Y?X>l#j!@@q=WKs-G8@LGtQFJ|c9Kj+Z&=BWp(P}wg)`S3Jcx04%O8+2J;g4D z9nS4g$)-AIaG%zIGMwLC2wF`{UIwCtrE^O+@;&u=1|;ohmE>o zW(Gw)MLceZWNVosJmEe*={e(J4W@S!$>|ZE(Rn-FilRbH@lE2MtqonN3aZ3Pe1Xw) z97UO%<@%0r!kWokt7EWJuwrh7TsPUa;>jhFizF0Gu*JG!M<)$S>XR}sB|gQJA_#k> z^QGpy#fHxh>}Q^lFg<}_e&YCqu?c6`?9eQ+QR4oDLwt97!hZ?Z5*j5mOZX7~Cca&K z$N1B6C*%H$yBYU`S{%11Zc*%#*p9L7V+AhLPt;b^RyMgcHT{RTNnnairV3L}4bKea z45@~@`Um>nFqbN^19Y14S4gdK#$ATJhVO=NhAQ+Rw+we6Gf50<=t0(#mGJ2Nx_j)& z6?Xjy9`t)K@{eeaXwGtudjJjK0n{ad*?LNQM!Qe5S922X4Tc3+`u{;%ng`K)lX@0e ziOSS`cK%Ex_49%E;vU{+RoLV9ifvmBnfX3|4F;h0-}N+me}Ai%UMc-9S9+?sgt2JG1Lr8(M?eJ{V0?t*zKeQiBpSw*mCd zuWc`Fdu;pYqX(c*oQEPd3&lcg6L`aq?GN&<@nY=Ux#YOum<(m_FIY`YA!b~0UUv4S zuNG#(!ypAtg`7RiHHf!UGZgMcq~h*yc5}J}-Fu&VKVG~`?lQcSc98cUPsbsg;kuHw zj-eiT9>5lEi`qTFYldfIfE@OU+D5PO79UAha<0AD1#yVCkl;~Sh0E2#+3X%W;9~qD zwqiA52E3Wqr_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 R4nsNnMDpTk*;)Q{{|AE37F_@U literal 0 HcmV?d00001 diff --git a/front/public/global.css b/front/public/global.css new file mode 100644 index 0000000..f856a8d --- /dev/null +++ b/front/public/global.css @@ -0,0 +1,77 @@ +html, body { + position: fixed; + overflow: hidden; + width: 100%; + height: 100%; +} + +body, input, button { + font-family: 'Press Start 2P', cursive; + font-size: 16px; +} + +body { + color: #e8e6e3; + margin: 0; + padding: 8px; + box-sizing: border-box; + background-color: #212529; +} + +a { + color: #198754; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +a:visited { + color: #157347; +} + +label { + display: block; +} + +input, button, select, textarea { + font-family: inherit; + font-size: inherit; + padding: 0.4em 0; + margin: 0 0 0.5em 0; + box-sizing: border-box; + border: 1px solid #495057; + border-radius: 4px; + background-color: #343a40; + color: #e8e6e3; +} + +input:disabled { + color: #6c757d; +} + +button { + color: #e8e6e3; + background-color: #198754; + border: none; + cursor: pointer; + padding: 0.5rem 1rem; + border-radius: 4px; + transition: background-color 0.2s ease-in-out; + font-size: 1rem; + outline: none; +} + +button:disabled { + color: #aab3bb; + cursor: not-allowed; +} + +button:not(:disabled):active { + background-color: #157347; +} + +button:focus { + box-shadow: 0 0 0 2px rgba(25, 135, 84, 0.25); +} \ No newline at end of file diff --git a/front/public/img/chat.png b/front/public/img/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..69ecb0d5f039821e5618e098e6d1cfe02b186296 GIT binary patch literal 724 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 literal 0 HcmV?d00001 diff --git a/front/public/img/pong.png b/front/public/img/pong.png new file mode 100644 index 0000000000000000000000000000000000000000..a02549575f4c89978ac68096869408b6ae689dd4 GIT binary patch literal 4256 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 CAus6w literal 0 HcmV?d00001 diff --git a/front/public/img/send.png b/front/public/img/send.png new file mode 100644 index 0000000000000000000000000000000000000000..bec0025be456b3880819b90791371245ed37262a GIT binary patch literal 858 zcmV-g1Eu_lP)=tmGLjH_vu z;3RR9P>4<{5kVb=7!?tvf)Lm&kwPgoCkoaeE47K%D8--hH?{IsdOrtyozC`jzVGV2 zpEal#Hs_qZ-o4+o_g-u5!+#z9{sqlj@Eqph^gk*52-e{o8qp43Z_&H32>UY8yuEup zLTR5Hx{D|`v(Vyda9yj(?bO`2SS0-=~+pz$j)rc>R_YJ)j z?T<&X7QbYZ@5f?{z)YN|i2oYn-iz;EAT^QMXT{paBjw$uytonT)-45?GH)2 zH0)|b2Vpig$Djr-Nn1W&%IN~*@ojK^l2YzZDG;XxXF}L__9Q$3Z{uXP+QV3h`zqXi zQmXwPylr?MUE%bcjJqN@FV~6Q5v$shiFQfpG+j!sD(=J<%38$|jC)4f|uwRyG>1;fQia zj^hof$}LeI)5pp*8Yx{WMQyLUVQ-b<>4f@Nx&r+*ujRi)?%nr`` zJ&9K_0l4mMSMTnaaC&ANi7%r6G@i+9uSWl}b~sSfg0K9&*mOuY z-KF5H$4&S=z8`F-1D!2+Q