├── .dockerignore ├── .github └── workflows │ └── docker-image.yml ├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── Dockerfile ├── LICENSE.md ├── Makefile ├── README.md ├── cores ├── .keep ├── mgba_libretro.js ├── mgba_libretro.wasm ├── quicknes_libretro.js ├── quicknes_libretro.wasm ├── snes9x2010_libretro.js └── snes9x2010_libretro.wasm ├── docker-compose.yml.example ├── example.webp ├── package.json ├── permissions.png ├── service.json ├── settings.png ├── src ├── bindings.cxx ├── config.ts ├── emulate.ts ├── gameInfo.ts ├── index.js ├── index.ts ├── libretro.h ├── mgba_libretro_emscripten.bc ├── quicknes_libretro_emscripten.bc ├── snes9x2010_libretro_emscripten.bc ├── util.ts ├── worker.ts └── workerInterface.ts ├── tsconfig.json └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .vscode 3 | Dockerfile 4 | example.webp 5 | .env 6 | data -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | push: 5 | branches: [ "*" ] 6 | pull_request: 7 | branches: [ "*" ] 8 | 9 | env: 10 | IMAGE_NAME: retrobot 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v3 18 | 19 | - name: Build the Docker image 20 | run: docker build . --file Dockerfile --tag $IMAGE_NAME 21 | 22 | - name: Log in to Docker Hub 23 | if: github.event_name == 'push' 24 | uses: docker/login-action@v2 25 | with: 26 | username: ${{ secrets.DOCKER_USERNAME }} 27 | password: ${{ secrets.DOCKER_TOKEN }} 28 | 29 | - name: Push image to Docker Hub 30 | if: github.event_name == 'push' 31 | run: | 32 | IMAGE_ID=${{ github.repository_owner }}/$IMAGE_NAME 33 | # Change all uppercase to lowercase 34 | IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') 35 | # Strip git ref prefix from version 36 | VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') 37 | # Strip "v" prefix from tag name 38 | [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') 39 | # Use Docker `latest` tag convention 40 | [ "$VERSION" == "master" ] && VERSION=latest 41 | echo IMAGE_ID=$IMAGE_ID 42 | echo VERSION=$VERSION 43 | docker tag $IMAGE_NAME $IMAGE_ID:$GITHUB_RUN_ID 44 | docker tag $IMAGE_NAME $IMAGE_ID:$VERSION 45 | docker push $IMAGE_ID:$GITHUB_RUN_ID 46 | docker push $IMAGE_ID:$VERSION 47 | 48 | - name: Log in to the GitHub Container Registry 49 | uses: docker/login-action@v2 50 | with: 51 | registry: ghcr.io 52 | username: ${{ github.actor }} 53 | password: ${{ secrets.GITHUB_TOKEN }} 54 | 55 | - name: Push image to GitHub Container Registry 56 | if: github.event_name == 'push' 57 | run: | 58 | IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME 59 | # Change all uppercase to lowercase 60 | IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') 61 | # Strip git ref prefix from version 62 | VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') 63 | # Strip "v" prefix from tag name 64 | [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') 65 | # Use Docker `latest` tag convention 66 | [ "$VERSION" == "master" ] && VERSION=latest 67 | echo IMAGE_ID=$IMAGE_ID 68 | echo VERSION=$VERSION 69 | docker tag $IMAGE_NAME $IMAGE_ID:$GITHUB_RUN_ID 70 | docker tag $IMAGE_NAME $IMAGE_ID:$VERSION 71 | docker push $IMAGE_ID:$GITHUB_RUN_ID 72 | docker push $IMAGE_ID:$VERSION 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.gif 3 | *.mp4 4 | *.png 5 | *.gb 6 | *.gba 7 | *.sfc 8 | *.smc 9 | *.sav 10 | *.nes 11 | frames.txt 12 | .env 13 | data 14 | forever 15 | docker-compose.yml -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceFolder}/src/index.ts", 12 | "internalConsoleOptions": "openOnSessionStart", 13 | "runtimeArgs": ["-r", "ts-node/register"] 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "functional": "cpp", 4 | "array": "cpp", 5 | "string": "cpp", 6 | "string_view": "cpp", 7 | "initializer_list": "cpp", 8 | "utility": "cpp", 9 | "thread": "cpp", 10 | "atomic": "cpp", 11 | "bit": "cpp", 12 | "*.tcc": "cpp", 13 | "cctype": "cpp", 14 | "chrono": "cpp", 15 | "clocale": "cpp", 16 | "cmath": "cpp", 17 | "condition_variable": "cpp", 18 | "cstdarg": "cpp", 19 | "cstddef": "cpp", 20 | "cstdint": "cpp", 21 | "cstdio": "cpp", 22 | "cstdlib": "cpp", 23 | "cstring": "cpp", 24 | "ctime": "cpp", 25 | "cwchar": "cpp", 26 | "cwctype": "cpp", 27 | "deque": "cpp", 28 | "map": "cpp", 29 | "unordered_map": "cpp", 30 | "vector": "cpp", 31 | "exception": "cpp", 32 | "algorithm": "cpp", 33 | "iterator": "cpp", 34 | "memory": "cpp", 35 | "memory_resource": "cpp", 36 | "numeric": "cpp", 37 | "optional": "cpp", 38 | "random": "cpp", 39 | "ratio": "cpp", 40 | "system_error": "cpp", 41 | "tuple": "cpp", 42 | "type_traits": "cpp", 43 | "fstream": "cpp", 44 | "iosfwd": "cpp", 45 | "iostream": "cpp", 46 | "istream": "cpp", 47 | "limits": "cpp", 48 | "mutex": "cpp", 49 | "new": "cpp", 50 | "ostream": "cpp", 51 | "sstream": "cpp", 52 | "stdexcept": "cpp", 53 | "streambuf": "cpp", 54 | "typeinfo": "cpp" 55 | } 56 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.16.2 2 | 3 | WORKDIR /retrobot 4 | 5 | RUN apk add --no-cache nodejs npm git python3 xz-dev make g++ 6 | RUN npm install --global yarn cross-env forever 7 | 8 | COPY . . 9 | 10 | RUN yarn install && yarn cache clean 11 | 12 | CMD ["yarn", "start"] 13 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ross Squires 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CXX = em++ 2 | CXXFLAGS += --bind \ 3 | -s WASM=1 -s LINKABLE=1 -s EXPORT_ALL=1 -s MODULARIZE=1 -O3 \ 4 | -sLLD_REPORT_UNDEFINED -sALLOW_MEMORY_GROWTH \ 5 | -lstdc++ \ 6 | --no-entry 7 | 8 | all: mgba_libretro.js quicknes_libretro.js snes9x2010_libretro.js 9 | 10 | mgba_libretro.js: src/mgba_libretro_emscripten.bc 11 | $(CXX) src/bindings.cxx src/mgba_libretro_emscripten.bc $(CXXFLAGS) -o cores/mgba_libretro.js 12 | 13 | quicknes_libretro.js: src/quicknes_libretro_emscripten.bc 14 | $(CXX) src/bindings.cxx src/quicknes_libretro_emscripten.bc $(CXXFLAGS) -o cores/quicknes_libretro.js 15 | 16 | snes9x2010_libretro.js: src/snes9x2010_libretro_emscripten.bc 17 | $(CXX) src/bindings.cxx src/snes9x2010_libretro_emscripten.bc $(CXXFLAGS) -o cores/snes9x2010_libretro.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![](https://dcbadge.vercel.app/api/server/dbcnjr9tp9)](https://discord.gg/dbcnjr9tp9) 2 | 3 | # Retrobot 4 | 5 | Retrobot is a Discord bot that allows you to play NES/SNES/GB/GBA games with your friends over chat! Think "TwitchPlaysPokemon", but with GIFs. It accepts button presses, emulates the result, and encodes a GIF to view. 6 | 7 | ![Example](example.webp) 8 | 9 | ## How to Use 10 | Once the bot has joined your Discord server, drop an ROM file into a channel. You can also use `ZIP`, `TAR.GZ`, `TAR.BZ2`, or `BZ2` archives. The bot will automatically find the ROM file, and begin emulation. Note: only server "administrators" can start new games. 11 | 12 | ## Input Assist 13 | Retrobot simplifies control by auto-forwarding through idle parts of games, such as conversations or battle animations. 14 | 15 | Additionally, numbered buttons are added to automatically repeat button presses. This is useful for walking in a specific direction for a long period. 16 | 17 | ## Settings 18 | You can configure how input assist works, how often input assist activates, and how directional button presses are repeated with the `/settings` command. 19 | 20 | ![Settings](settings.png) 21 | 22 | ## How to Set Up 23 | Create a bot in the [Discord Developer Portal](https://discord.com/developers/applications), and obtain a token for your bot. Also, ensure "Message Content Intent" is enabled for your bot. 24 | 25 | ![Message Content Intent screenshot](permissions.png) 26 | 27 | Create a file name exactly `.env` in your clone of this repository with the following contents: 28 | ``` 29 | DISCORD_TOKEN=YOUR DISCORD TOKEN HERE 30 | ``` 31 | 32 | Run these commands: 33 | ``` 34 | yarn install 35 | yarn start 36 | ``` 37 | 38 | Then invite the bot to a server with the following URL. Be sure to update the OAuth Client ID. 39 | ``` 40 | https://discord.com/api/oauth2/authorize?client_id=YOUR_OAUTH_CLIENT_ID_HERE&permissions=68608&scope=bot 41 | ``` 42 | 43 | ## Config 44 | 45 | There are additional configuration options you can to your `.env` file to tweak performance: 46 | 47 | ### `MAX_WORKERS` 48 | By default, Retrobot will create a worker thread for each CPU core on the host system. These workers are use parrallelize multiple games, and to split the work for input assist detection. If you're low on RAM, tweaking this number to something small (i.e., `2`) will reduce memory usage at the cost of total emulation time. 49 | 50 | ### `MAX_WORKERS_PER_GAME` 51 | By default, Retrobot will use 3 input assist worker threads to emulate the result of a button press for a game. Raising this number for faster systems will speed up input assist for games with lots of uninterupptable scenes (conversations, cinematics, etc). Raising this number above `MAX_WORKERS` does not have an effect. 52 | 53 | ### `RECORDING_FRAMERATE` 54 | By default, Retrobot will encode GIFs at max of 30 FPS. You can configure this to be between 1 and 60 FPS. 55 | 56 | ### Example 57 | ``` 58 | DISCORD_TOKEN=YOUR DISCORD TOKEN HERE 59 | MAX_WORKERS=2 60 | RECORDING_FRAMERATE=60 61 | ``` 62 | 63 | ## Running as a Daemon 64 | If you'd like a simple way to run the bot as a background service, there's a helper `yarn` script. It will fire up the bot as a background service, and record logs to `./forever/retrobot.log` 65 | ``` 66 | yarn service:start 67 | ``` 68 | And to stop: 69 | ``` 70 | yarn service:stop 71 | ``` 72 | 73 | ## Running via Docker 74 | Create a file name exactly `.env` in your clone of this repository with the following contents: 75 | ``` 76 | DISCORD_TOKEN=YOUR DISCORD TOKEN HERE 77 | ``` 78 | 79 | Run the official Docker image: 80 | ``` 81 | docker run -d -v ./data:/retrobot/data --env-file .env rossimo/retrobot 82 | ``` 83 | 84 | ## Running via Docker Compose 85 | 86 | Requires Docker and Docker Compose is installed on the machine. 87 | 88 | - Rename `docker-compose.yml.example` to `docker-compose.yml` 89 | - Edit `docker-compose.yml` and your Discord bot token. 90 | - Run `docker-compose build` 91 | - Run `docker-compose up -d` 92 | 93 | ## Technical Notes 94 | Retrobot is built on [`libretro`](https://github.com/libretro/libretro-common), the code that powers [RetroArch](https://www.retroarch.com/). Several `libretro` cores have been cross-compiled to WASM to be used in [Node.js](https://www.retroarch.com/). Since WASM modules have independent memory spaces, it means several cores of the same type can be instanced. This allows parallelism. 95 | 96 | ## License 97 | The bot source code here is licensed as MIT. The `libretro` core each have their own licenses. 98 | * mGBA - https://github.com/libretro/mgba/blob/master/LICENSE 99 | * QuickNES - https://github.com/libretro/QuickNES_Core/blob/master/LICENSE 100 | * snes9x2010 - https://github.com/libretro/snes9x2010/blob/master/LICENSE.txt 101 | -------------------------------------------------------------------------------- /cores/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/cores/.keep -------------------------------------------------------------------------------- /cores/mgba_libretro.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/cores/mgba_libretro.wasm -------------------------------------------------------------------------------- /cores/quicknes_libretro.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/cores/quicknes_libretro.wasm -------------------------------------------------------------------------------- /cores/snes9x2010_libretro.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/cores/snes9x2010_libretro.wasm -------------------------------------------------------------------------------- /docker-compose.yml.example: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | retrobot: 4 | volumes: 5 | - ./data:/retrobot/data 6 | build: . 7 | restart: unless-stopped 8 | environment: 9 | DISCORD_TOKEN: YOUR DISCORD TOKEN HERE -------------------------------------------------------------------------------- /example.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/example.webp -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "libretro-webassembly-simple", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "Ross Squires ", 6 | "license": "MIT", 7 | "scripts": { 8 | "start": "ts-node src/index.ts", 9 | "service:start": "cross-env FOREVER_ROOT=./forever forever start service.json", 10 | "service:stop": "cross-env FOREVER_ROOT=./forever forever stop retrobot" 11 | }, 12 | "dependencies": { 13 | "@ffmpeg-installer/ffmpeg": "^1.1.0", 14 | "@ffprobe-installer/ffprobe": "^1.4.1", 15 | "@types/decompress": "^4.2.4", 16 | "@types/fluent-ffmpeg": "^2.1.20", 17 | "@types/lodash": "^4.14.184", 18 | "@types/lru-cache": "^7.10.10", 19 | "@types/md5": "^2.3.2", 20 | "@types/node": "^18.7.8", 21 | "@types/sharp": "^0.30.5", 22 | "@types/shelljs": "^0.8.11", 23 | "@types/tmp": "^0.2.3", 24 | "@types/uuid": "^8.3.4", 25 | "bottleneck": "^2.19.5", 26 | "cross-env": "^7.0.3", 27 | "decompress": "^4.2.1", 28 | "decompress-bzip2": "^4.0.0", 29 | "decompress-tarbz2": "^4.1.1", 30 | "decompress-targz": "^4.1.1", 31 | "discord.js": "^14.9.0", 32 | "dotenv": "^16.0.1", 33 | "fast-glob": "^3.2.11", 34 | "fluent-ffmpeg": "https://github.com/rossimo/node-fluent-ffmpeg", 35 | "forever": "^4.0.3", 36 | "hash-wasm": "^4.9.0", 37 | "image-encode": "^1.3.1", 38 | "lodash": "^4.17.21", 39 | "lru-cache": "^7.14.0", 40 | "md5": "^2.3.0", 41 | "piscina": "^3.2.0", 42 | "shelljs": "^0.8.5", 43 | "tmp": "^0.2.1", 44 | "ts-node": "^10.9.1", 45 | "typescript": "^4.7.4", 46 | "uuid": "^8.3.2" 47 | }, 48 | "optionalDependencies": { 49 | "bufferutil": "^4.0.6", 50 | "erlpack": "^0.1.4", 51 | "utf-8-validate": "^5.0.9", 52 | "zlib-sync": "^0.1.7" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/permissions.png -------------------------------------------------------------------------------- /service.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid": "retrobot", 3 | "script": "src/index.js", 4 | "append": true 5 | } -------------------------------------------------------------------------------- /settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/settings.png -------------------------------------------------------------------------------- /src/bindings.cxx: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | extern "C" 5 | { 6 | #include "libretro.h" 7 | } 8 | 9 | void simple_retro_get_system_info(emscripten::val obj) 10 | { 11 | struct retro_system_info info = {0}; 12 | retro_get_system_info(&info); 13 | 14 | obj.set("library_name", info.library_name); 15 | obj.set("library_version", info.library_version); 16 | obj.set("valid_extensions", info.valid_extensions); 17 | obj.set("need_fullpath", info.need_fullpath); 18 | obj.set("block_extract", info.block_extract); 19 | } 20 | 21 | void simple_retro_get_system_av_info(emscripten::val obj) 22 | { 23 | struct retro_system_av_info info = {0}; 24 | retro_get_system_av_info(&info); 25 | 26 | obj.set("geometry_base_width", info.geometry.base_width); 27 | obj.set("geometry_base_height", info.geometry.base_height); 28 | obj.set("geometry_max_width", info.geometry.max_width); 29 | obj.set("geometry_max_height", info.geometry.max_height); 30 | obj.set("geometry_aspect_ratio", info.geometry.aspect_ratio); 31 | 32 | obj.set("timing_fps", info.timing.fps); 33 | obj.set("timing_sample_rate", info.timing.sample_rate); 34 | } 35 | 36 | bool simple_retro_serialize(emscripten::val dataVal, emscripten::val sizeVal) 37 | { 38 | void *data = (void *)dataVal.as(); 39 | size_t size = sizeVal.as(); 40 | 41 | return retro_serialize(data, size); 42 | } 43 | 44 | bool simple_retro_unserialize(emscripten::val dataVal, emscripten::val sizeVal) 45 | { 46 | void *data = (void *)dataVal.as(); 47 | size_t size = sizeVal.as(); 48 | 49 | return retro_unserialize(data, size); 50 | } 51 | 52 | emscripten::val retro_environment_callback = emscripten::val::undefined(); 53 | 54 | bool inner_retro_environment(unsigned cmd, void *data) 55 | { 56 | if (cmd == RETRO_ENVIRONMENT_GET_VARIABLE) { 57 | retro_variable *var = (retro_variable *) data; 58 | if (strcmp(var->key, "mgba_sgb_borders") == 0) { 59 | var->value = "OFF"; 60 | return true; 61 | } 62 | } 63 | 64 | if (retro_environment_callback != emscripten::val::undefined()) 65 | { 66 | return retro_environment_callback(cmd, (unsigned)data).as(); 67 | } 68 | 69 | return false; 70 | } 71 | 72 | void simple_retro_set_environment(emscripten::val val) 73 | { 74 | retro_environment_callback = val; 75 | 76 | retro_set_environment(&inner_retro_environment); 77 | } 78 | 79 | emscripten::val retro_video_refresh_callback = emscripten::val::undefined(); 80 | 81 | void inner_retro_set_video_refresh(const void *data, unsigned width, unsigned height, size_t pitch) 82 | { 83 | if (retro_video_refresh_callback != emscripten::val::undefined()) 84 | { 85 | retro_video_refresh_callback((unsigned)data, (unsigned int)width, (unsigned int)height, (unsigned int)pitch); 86 | } 87 | } 88 | 89 | void simple_retro_set_video_refresh(emscripten::val val) 90 | { 91 | retro_video_refresh_callback = val; 92 | 93 | retro_set_video_refresh(&inner_retro_set_video_refresh); 94 | } 95 | 96 | void inner_retro_set_input_poll() 97 | { 98 | } 99 | 100 | emscripten::val retro_set_input_state_callback = emscripten::val::undefined(); 101 | 102 | void simple_retro_set_input_state(emscripten::val val) 103 | { 104 | retro_set_input_state_callback = val; 105 | } 106 | 107 | int16_t inner_retro_set_input_state(unsigned port, unsigned device, unsigned index, unsigned id) 108 | { 109 | if (retro_set_input_state_callback != emscripten::val::undefined()) 110 | { 111 | return retro_set_input_state_callback((unsigned int)port, (unsigned int)device, (unsigned int)index, (unsigned int)id).as(); 112 | } 113 | 114 | return 0; 115 | } 116 | 117 | void inner_retro_set_audio_sample(int16_t left, int16_t right) 118 | { 119 | } 120 | 121 | size_t inner_retro_set_audio_sample_batch(const int16_t *data, size_t frames) 122 | { 123 | return 0; 124 | } 125 | 126 | bool simple_retro_load_game(emscripten::val val) 127 | { 128 | retro_set_environment(&inner_retro_environment); 129 | retro_set_video_refresh(&inner_retro_set_video_refresh); 130 | retro_set_input_poll(&inner_retro_set_input_poll); 131 | retro_set_input_state(&inner_retro_set_input_state); 132 | retro_set_audio_sample(&inner_retro_set_audio_sample); 133 | retro_set_audio_sample_batch(&inner_retro_set_audio_sample_batch); 134 | retro_init(); 135 | 136 | retro_game_info info; 137 | info.data = (const char *)val["data"].as(); 138 | info.size = val["size"].as(); 139 | 140 | return retro_load_game(&info); 141 | } 142 | 143 | EMSCRIPTEN_BINDINGS(libretro_bindings) 144 | { 145 | emscripten::function("retro_get_system_info", &simple_retro_get_system_info); 146 | emscripten::function("retro_get_system_av_info", &simple_retro_get_system_av_info); 147 | emscripten::function("retro_set_environment", &simple_retro_set_environment); 148 | emscripten::function("retro_load_game", &simple_retro_load_game); 149 | emscripten::function("retro_set_video_refresh", &simple_retro_set_video_refresh); 150 | emscripten::function("retro_run", &retro_run); 151 | emscripten::function("retro_init", &retro_init); 152 | emscripten::function("retro_reset", &retro_reset); 153 | emscripten::function("retro_serialize_size", &retro_serialize_size); 154 | emscripten::function("retro_serialize", &simple_retro_serialize); 155 | emscripten::function("retro_unserialize", &simple_retro_unserialize); 156 | emscripten::function("retro_set_input_state", &simple_retro_set_input_state); 157 | emscripten::function("retro_unload_game", &retro_unload_game); 158 | } -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | import { has, parseInt } from 'lodash'; 3 | 4 | export const MAX_WORKERS = has(process.env, 'MAX_WORKERS') 5 | ? parseInt(process.env.MAX_WORKERS) 6 | : -1; 7 | 8 | export const MAX_WORKERS_PER_GAME = has(process.env, 'MAX_WORKERS_PER_GAME') 9 | ? parseInt(process.env.MAX_WORKERS_PER_GAME) 10 | : 3; 11 | 12 | export const RECORDING_FRAMERATE = Math.max(Math.min(has(process.env, 'RECORDING_FRAMERATE') 13 | ? parseInt(process.env.RECORDING_FRAMERATE) 14 | : 30, 60), 1); -------------------------------------------------------------------------------- /src/emulate.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | import * as fs from 'fs'; 3 | import * as tmp from 'tmp'; 4 | import * as path from 'path'; 5 | import Piscina from 'piscina'; 6 | import Bottleneck from 'bottleneck'; 7 | import encode from 'image-encode'; 8 | import { crc32c } from 'hash-wasm'; 9 | import * as shelljs from 'shelljs'; 10 | import ffmpeg from 'fluent-ffmpeg'; 11 | import { performance } from 'perf_hooks'; 12 | import { values, first, size, last, isEqual } from 'lodash'; 13 | import { path as ffmpegPath } from '@ffmpeg-installer/ffmpeg'; 14 | import { path as ffprobePath } from '@ffprobe-installer/ffprobe'; 15 | 16 | import { arraysEqual, InputState, isDirection, rgb565toRaw } from './util'; 17 | import { emulateParallel } from './workerInterface'; 18 | import { Frame } from './worker'; 19 | import { DirectionPress, GameInfo, InputAssist, InputAssistSpeed } from './gameInfo'; 20 | import { MAX_WORKERS_PER_GAME, RECORDING_FRAMERATE } from './config'; 21 | 22 | tmp.setGracefulCleanup(); 23 | 24 | ffmpeg.setFfmpegPath(ffmpegPath); 25 | ffmpeg.setFfprobePath(ffprobePath); 26 | 27 | interface AutoplayInputState extends InputState { 28 | autoplay?: boolean 29 | data?: any 30 | } 31 | 32 | const TEST_INPUTS: AutoplayInputState[] = [ 33 | { A: true, autoplay: true }, 34 | { B: true, autoplay: false }, 35 | { DOWN: true, autoplay: false }, 36 | { UP: true, autoplay: false }, 37 | { LEFT: true, autoplay: false }, 38 | { RIGHT: true, autoplay: false }, 39 | { SELECT: true, autoplay: false } 40 | ]; 41 | 42 | export enum CoreType { 43 | NES = 'nes', 44 | SNES = 'snes', 45 | GB = 'gb', 46 | GBA = 'gba' 47 | } 48 | 49 | export const emulate = async (pool: Piscina, coreType: CoreType, game: Uint8Array, state: Uint8Array, info: GameInfo, playerInputs: InputState[]) => { 50 | let data = { coreType, game, state, frames: [], av_info: {} as any }; 51 | 52 | const startEmulation = performance.now(); 53 | 54 | const inputAssistBottleneck = new Bottleneck({ 55 | ...MAX_WORKERS_PER_GAME == -1 56 | ? {} 57 | : { maxConcurrent: MAX_WORKERS_PER_GAME } 58 | }); 59 | 60 | for (let i = 0; i < playerInputs.length; i++) { 61 | const prev = playerInputs[i - 1]; 62 | const current = playerInputs[i]; 63 | const next = playerInputs[i + 1]; 64 | 65 | if (isDirection(current)) { 66 | if (info.directionPress == DirectionPress.Hold && (isEqual(current, next) || isEqual(current, prev))) { 67 | data = await emulateParallel(pool, data, { input: current, duration: 20 }); 68 | } else { 69 | data = await emulateParallel(pool, data, { input: current, duration: 8 }); 70 | data = await emulateParallel(pool, data, { input: {}, duration: 8 }); 71 | } 72 | } else { 73 | data = await emulateParallel(pool, data, { input: current, duration: 4 }); 74 | data = await emulateParallel(pool, data, { input: {}, duration: 16 }); 75 | } 76 | } 77 | 78 | if (info.inputAssist == InputAssist.Off) { 79 | data = await emulateParallel(pool, data, { input: {}, duration: 20 }); 80 | } else { 81 | let inputAssistWait = 60; 82 | switch (info.inputAssistSpeed) { 83 | case InputAssistSpeed.Fast: 84 | inputAssistWait = 30; 85 | break; 86 | 87 | case InputAssistSpeed.Slow: 88 | inputAssistWait = 120; 89 | break; 90 | 91 | default: 92 | case InputAssistSpeed.Normal: 93 | inputAssistWait = 60; 94 | break; 95 | } 96 | 97 | const endFrameCount = data.frames.length + 30 * 60; 98 | 99 | test: while (data.frames.length < endFrameCount) { 100 | const possibilities: { [hash: string]: AutoplayInputState } = {}; 101 | 102 | const controlResultTask = emulateParallel(pool, data, { input: {}, duration: 20 }) 103 | const controlHashTask = controlResultTask.then(result => crc32c(last(result.frames).buffer)); 104 | 105 | await Promise.all(TEST_INPUTS.map(testInput => async () => { 106 | if (size(possibilities) > 1) { 107 | return; 108 | } 109 | 110 | const testInputData = await emulateParallel(pool, data, { input: testInput, duration: 4 }); 111 | const testIdleData = await emulateParallel(pool, testInputData, { input: {}, duration: 16 }); 112 | 113 | const testHash = await crc32c(last(testIdleData.frames).buffer); 114 | 115 | if ((await controlHashTask) != testHash) { 116 | if (!possibilities[testHash] || (possibilities[testHash] && testInput.autoplay)) { 117 | possibilities[testHash] = { 118 | ...testInput, 119 | data: testIdleData 120 | }; 121 | } 122 | } 123 | }).map(task => inputAssistBottleneck.schedule(task))); 124 | 125 | const possibleAutoplay = first(values(possibilities)); 126 | 127 | if (size(possibilities) > 1 || (size(possibilities) == 1 && info.inputAssist == InputAssist.Wait)) { 128 | data = await emulateParallel(pool, data, { input: {}, duration: 20 }); 129 | break test; 130 | } else if (size(possibilities) == 1 && possibleAutoplay.autoplay) { 131 | data = possibleAutoplay.data; 132 | } else { 133 | data = await controlResultTask; 134 | } 135 | 136 | data = await emulateParallel(pool, data, { input: {}, duration: inputAssistWait }); 137 | } 138 | } 139 | 140 | const endEmulation = performance.now(); 141 | console.log(`Emulation: ${endEmulation - startEmulation}`); 142 | 143 | const startFrames = performance.now(); 144 | 145 | const { frames } = data; 146 | const importantFrames: (Frame & { renderTime: number })[] = []; 147 | let lastFrame: Frame; 148 | let durationSinceFrame = 0; 149 | for (let i = 0; i < frames.length; i++) { 150 | if (i == 0 || durationSinceFrame >= (60 / RECORDING_FRAMERATE)) { 151 | const currentFrame = frames[i]; 152 | 153 | if (!arraysEqual(currentFrame.buffer, lastFrame?.buffer)) { 154 | importantFrames.push({ 155 | ...currentFrame, 156 | renderTime: i 157 | }) 158 | 159 | lastFrame = currentFrame; 160 | durationSinceFrame = 0; 161 | } 162 | } else { 163 | durationSinceFrame++; 164 | } 165 | } 166 | 167 | if (!arraysEqual(last(frames).buffer, lastFrame.buffer)) { 168 | importantFrames.push({ 169 | ...last(frames), 170 | renderTime: frames.length 171 | }) 172 | } 173 | 174 | const tmpFrameDir = tmp.dirSync({ unsafeCleanup: true }); 175 | 176 | const { width, height } = last(importantFrames); 177 | 178 | const images = await Promise.all(importantFrames.map((frame) => { 179 | const file = path.join(tmpFrameDir.name, `frame-${frame.renderTime}.bmp`); 180 | 181 | return new Promise<{ file: string, frameNumber: number }>((res, rej) => 182 | fs.writeFile(file, Buffer.from(encode(rgb565toRaw(frame), [width, height], 'bmp')), (err) => { 183 | if (err) { 184 | rej(err) 185 | } else { 186 | res({ 187 | file, 188 | frameNumber: frame.renderTime 189 | }); 190 | } 191 | })); 192 | })) 193 | 194 | const endFrames = performance.now(); 195 | console.log(`Exporting frames: ${endFrames - startFrames}`); 196 | 197 | const startEncode = performance.now(); 198 | 199 | let framesTxt = ''; 200 | for (let i = 0; i < images.length; i++) { 201 | const current = images[i]; 202 | 203 | framesTxt += `file '${current.file}'\n`; 204 | 205 | const next = images[i + 1]; 206 | if (next) { 207 | framesTxt += `duration ${(next.frameNumber - current.frameNumber) / 60}\n`; 208 | } 209 | } 210 | 211 | framesTxt += `duration ${1 / 60}\n`; 212 | framesTxt += `file '${last(images).file}'\n`; 213 | framesTxt += `duration 5\n`; 214 | framesTxt += `file '${last(images).file}'\n`; 215 | 216 | const tmpFramesList = tmp.fileSync({ discardDescriptor: true }); 217 | fs.writeFileSync(tmpFramesList.name, framesTxt); 218 | 219 | const { name: outputName } = tmp.fileSync(); 220 | const gifOutput = `${outputName}.gif`; 221 | const mp4Output = `${outputName}.mp4`; 222 | let output = gifOutput; 223 | 224 | await new Promise((res, rej) => 225 | ffmpeg() 226 | .input(tmpFramesList.name) 227 | .addInputOption('-safe', '0') 228 | .inputFormat('concat') 229 | .addOption('-filter_complex', `scale=2*iw:2*ih:flags=neighbor,split=2 [a][b]; [a] palettegen=${coreType == CoreType.SNES ? 'stats_mode=diff' : ''} [pal]; [b] fifo [b]; [b] [pal] paletteuse=dither=bayer:bayer_scale=5`) 230 | .output(gifOutput) 231 | .on('error', (err, stdout, stderr) => { 232 | console.log(stdout) 233 | console.error(stderr); 234 | rej(err) 235 | }) 236 | .on('end', res) 237 | .run()); 238 | 239 | if (fs.statSync(gifOutput).size > 8 * 1024 * 1024) { 240 | output = mp4Output 241 | 242 | await new Promise((res, rej) => 243 | ffmpeg() 244 | .input(gifOutput) 245 | .output(mp4Output) 246 | .on('error', (err, stdout, stderr) => { 247 | console.log(stdout) 248 | console.error(stderr); 249 | rej(err) 250 | }) 251 | .on('end', res) 252 | .run()); 253 | } 254 | 255 | const recordingBuffer = fs.readFileSync(output); 256 | 257 | shelljs.rm('-rf', gifOutput); 258 | shelljs.rm('-rf', mp4Output); 259 | 260 | tmpFrameDir.removeCallback(); 261 | tmpFramesList.removeCallback(); 262 | 263 | const endEncode = performance.now(); 264 | console.log(`Encoding: ${endEncode - startEncode}`); 265 | 266 | return { 267 | state: data.state, 268 | recording: recordingBuffer, 269 | recordingName: path.basename(output) 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /src/gameInfo.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import { CoreType } from "./emulate" 3 | 4 | export enum InputAssist { 5 | Autoplay = 'autoplay', 6 | Wait = 'wait', 7 | Off = 'off' 8 | } 9 | 10 | export enum InputAssistSpeed { 11 | Fast = 'fast', 12 | Normal = 'normal', 13 | Slow = 'slow' 14 | } 15 | 16 | export enum DirectionPress { 17 | Hold = 'hold', 18 | Release = 'release' 19 | } 20 | 21 | export interface GameInfo { 22 | game: string 23 | coreType: CoreType 24 | guild: string 25 | channelId: string 26 | inputAssist: InputAssist 27 | inputAssistSpeed: InputAssistSpeed 28 | directionPress: DirectionPress 29 | multipliers: Array 30 | } 31 | 32 | export const isGameId = (id: string) => { 33 | return fs.existsSync(`data/${id}`); 34 | } 35 | 36 | export const getGameInfo = (id: string): GameInfo => { 37 | const info = JSON.parse(fs.readFileSync(`data/${id}/info.json`).toString()); 38 | if (info['multipliers'] == undefined) 39 | { 40 | info['multipliers'] = [3, 5, 10]; 41 | } 42 | return { 43 | inputAssist: InputAssist.Autoplay, 44 | inputAssistSpeed: InputAssistSpeed.Normal, 45 | directionPress: DirectionPress.Release, 46 | ...info 47 | } 48 | } 49 | 50 | export const setGameInfo = (id: string, info: GameInfo) => { 51 | return fs.writeFileSync(`data/${id}/info.json`, JSON.stringify(info, null, 4)); 52 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | require('ts-node/register') 2 | require('./index.ts') -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | import * as fs from 'fs'; 3 | import Piscina from 'piscina'; 4 | import * as path from 'path'; 5 | import glob from 'fast-glob'; 6 | import { request } from 'undici'; 7 | import { v4 as uuid } from 'uuid'; 8 | import * as shelljs from 'shelljs'; 9 | import decompress from 'decompress'; 10 | //import decompressTarxz from 'decompress-tarxz'; 11 | import decompressBzip2 from 'decompress-bzip2'; 12 | import decompressTargz from 'decompress-targz'; 13 | import decompressTarbz2 from 'decompress-tarbz2'; 14 | import { toLower, endsWith, range, uniq, split, first, reduce } from 'lodash'; 15 | import { 16 | ActionRowBuilder, ButtonBuilder, ButtonStyle, CacheType, Client, StringSelectMenuBuilder, 17 | ComponentType, MessageActionRowComponentBuilder, GatewayIntentBits, Interaction, Message, 18 | PermissionsBitField, TextChannel, BaseMessageOptions, SlashCommandBuilder 19 | } from 'discord.js'; 20 | 21 | import { InputState } from './util'; 22 | import { CoreType, emulate } from './emulate'; 23 | import { setGameInfo, isGameId, getGameInfo, GameInfo, InputAssist, InputAssistSpeed, DirectionPress } from './gameInfo'; 24 | import { MAX_WORKERS } from './config'; 25 | 26 | const NES = ['nes']; 27 | const SNES = ['sfc', 'smc']; 28 | const GB = ['gb', 'gbc']; 29 | const GBA = ['gba']; 30 | const COMPRESSED = ['zip', 'tar.gz', 'tar.bz2', 'tar.xz', 'bz2']; 31 | 32 | const ALL = [...NES, ...SNES, ...GB, ...GBA, ...COMPRESSED]; 33 | 34 | const pool = new Piscina({ 35 | filename: path.resolve(__dirname, path.resolve(__dirname, 'worker.ts')), 36 | name: 'default', 37 | execArgv: ['-r', 'ts-node/register'], 38 | ...MAX_WORKERS == -1 39 | ? {} 40 | : { maxThreads: MAX_WORKERS } 41 | }); 42 | 43 | const main = async () => { 44 | const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] }); 45 | 46 | await client.login(process.env.DISCORD_TOKEN); 47 | console.log('online'); 48 | 49 | const command = new SlashCommandBuilder() 50 | .setName('settings') 51 | .setDescription('Configure settings for the most recent game in the channel'); 52 | 53 | client.application.commands.set([command]); 54 | 55 | await unlockGames(client); 56 | 57 | client.on('messageCreate', async (message: Message) => { 58 | try { 59 | const attachment = message.attachments.find(att => !!ALL.find(ext => endsWith(toLower(att.name), ext))); 60 | if (!attachment || !message.member.permissions.has(PermissionsBitField.Flags.Administrator)) { 61 | return; 62 | } 63 | 64 | let game: string; 65 | let buffer: Buffer; 66 | let coreType: CoreType; 67 | 68 | if (COMPRESSED.find(ext => endsWith(toLower(attachment.name), ext))) { 69 | const { body } = await request(attachment.url); 70 | 71 | const files = await decompress( 72 | Buffer.from(await body.arrayBuffer()), 73 | null, 74 | { plugins: [decompressTargz(), decompressTarbz2(), /* decompressTarxz(), */ decompressBzip2()] }); 75 | 76 | const entry = files.find(file => detectCore(file.path)); 77 | 78 | if (entry) { 79 | buffer = entry.data; 80 | coreType = detectCore(entry.path); 81 | game = path.parse(entry.path).base.replace(/[^0-9a-zA-Z_ \.]/gi, ''); 82 | } else { 83 | return; 84 | } 85 | } else { 86 | coreType = detectCore(attachment.name); 87 | if (!coreType) { 88 | return; 89 | } 90 | 91 | const { body } = await request(attachment.url); 92 | buffer = Buffer.from(await body.arrayBuffer()); 93 | game = attachment.name; 94 | } 95 | 96 | message.channel.sendTyping(); 97 | 98 | const id = uuid().slice(0, 5); 99 | 100 | const data = path.resolve('data', id); 101 | shelljs.mkdir('-p', data); 102 | 103 | const gameFile = path.join(data, game); 104 | fs.writeFileSync(gameFile, buffer); 105 | 106 | const info: GameInfo = { 107 | game, 108 | coreType, 109 | guild: message.guildId, 110 | channelId: message.channelId, 111 | inputAssist: InputAssist.Autoplay, 112 | inputAssistSpeed: InputAssistSpeed.Normal, 113 | directionPress: DirectionPress.Release, 114 | multipliers: [3, 5, 10], 115 | }; 116 | 117 | setGameInfo(id, info); 118 | 119 | const { recording, recordingName, state } = await emulate(pool, coreType, buffer, null, info, []); 120 | 121 | const stateFile = path.join(data, 'state.sav'); 122 | fs.writeFileSync(stateFile, state); 123 | 124 | await message.channel.send({ 125 | files: [{ 126 | attachment: recording, 127 | name: recordingName 128 | }], 129 | components: buttons(coreType, id, 1, true, info.multipliers), 130 | }); 131 | } catch (err) { 132 | console.error(err); 133 | } 134 | }); 135 | 136 | client.on('interactionCreate', async (interaction: Interaction) => { 137 | const isAdmin = interaction.memberPermissions.has(PermissionsBitField.Flags.Administrator); 138 | 139 | try { 140 | if (interaction.isCommand() && isAdmin) { 141 | if (interaction.commandName == 'settings') { 142 | const result = await findMostRecentGame(client, interaction.channelId); 143 | 144 | if (result) { 145 | const { id } = result; 146 | const info = getGameInfo(id); 147 | 148 | await interaction.reply(`Settings for ${info.game}`); 149 | 150 | for (const setting of settingsForm(result.id, info)) { 151 | await interaction.channel.send(setting); 152 | } 153 | } else { 154 | await interaction.reply('Could not find game'); 155 | } 156 | } 157 | } 158 | 159 | if (interaction.isStringSelectMenu() && isAdmin) { 160 | const [name, id, setting] = interaction.customId.split('-'); 161 | 162 | if (name == 'settings' && isGameId(id)) { 163 | const info = getGameInfo(id); 164 | 165 | if (setting == 'input_assist') { 166 | const [value] = interaction.values; 167 | switch (value) { 168 | case InputAssist.Wait: 169 | info.inputAssist = InputAssist.Wait; 170 | break; 171 | 172 | case InputAssist.Off: 173 | info.inputAssist = InputAssist.Off; 174 | break; 175 | 176 | default: 177 | case InputAssist.Autoplay: 178 | info.inputAssist = InputAssist.Autoplay; 179 | break; 180 | } 181 | 182 | setGameInfo(id, info); 183 | interaction.update(inputAssistSetting(id, info)); 184 | } else if (setting == 'input_assist_speed') { 185 | const [value] = interaction.values; 186 | switch (value) { 187 | case InputAssistSpeed.Fast: 188 | info.inputAssistSpeed = InputAssistSpeed.Fast; 189 | break; 190 | 191 | case InputAssistSpeed.Slow: 192 | info.inputAssistSpeed = InputAssistSpeed.Slow; 193 | break; 194 | 195 | default: 196 | case InputAssistSpeed.Normal: 197 | info.inputAssistSpeed = InputAssistSpeed.Normal; 198 | break; 199 | } 200 | 201 | setGameInfo(id, info); 202 | interaction.update(inputAssistSpeedSetting(id, info)); 203 | } else if (setting == 'direction_press') { 204 | const [value] = interaction.values; 205 | switch (value) { 206 | case DirectionPress.Hold: 207 | info.directionPress = DirectionPress.Hold; 208 | break; 209 | 210 | default: 211 | case DirectionPress.Release: 212 | info.directionPress = DirectionPress.Release; 213 | break; 214 | } 215 | 216 | setGameInfo(id, info); 217 | interaction.update(directionPressSetting(id, info)); 218 | } 219 | } 220 | } 221 | 222 | if (interaction.isButton()) { 223 | const player = client.guilds.cache.get(interaction.guildId).members.cache.get(interaction.user.id); 224 | const message = interaction.message; 225 | 226 | const [id, button, multiplier] = interaction.customId.split('-'); 227 | if (id == 'settings') { 228 | const [_, id, setting, button] = interaction.customId.split('-'); 229 | if (setting == 'multiplier') { 230 | const info = getGameInfo(id); 231 | const num = parseInt(button); 232 | if (info.multipliers.includes(num)) { 233 | info.multipliers.splice(info.multipliers.indexOf(num), 1); 234 | } else { 235 | info.multipliers.push(num); 236 | info.multipliers.sort((a,b) => a-b); 237 | } 238 | setGameInfo(id, info); 239 | interaction.update(multiplierSetting(id, info)); 240 | } 241 | return; 242 | } 243 | if (isGameId(id)) { 244 | const info = getGameInfo(id); 245 | 246 | (async () => { 247 | try { 248 | if (isNumeric(button)) { 249 | await message.edit({ components: buttons(info.coreType, id, parseInt(button), true, info.multipliers) }); 250 | } else { 251 | await message.edit({ components: buttons(info.coreType, id, parseInt(multiplier), false, info.multipliers, button) }); 252 | } 253 | 254 | await interaction.update({}); 255 | } catch (err) { 256 | console.error(err); 257 | } 258 | })() 259 | 260 | let playerInputs: InputState[] = []; 261 | 262 | if (isNumeric(button)) { 263 | } else { 264 | playerInputs = range(0, parseInt(multiplier)).map(() => parseInput(button)); 265 | } 266 | 267 | if (playerInputs.length > 0) { 268 | message.channel.sendTyping(); 269 | 270 | let game = fs.readFileSync(path.resolve('data', id, info.game)) 271 | let oldState = fs.readFileSync(path.resolve('data', id, 'state.sav')); 272 | 273 | const { recording, recordingName, state: newState } = await emulate(pool, info.coreType, game, oldState, info, playerInputs); 274 | 275 | fs.writeFileSync(path.resolve('data', id, 'state.sav'), newState); 276 | 277 | await message.channel.send({ 278 | content: `${player.nickname || player.displayName} pressed ${joyToWord(first(playerInputs))}${parseInt(multiplier) > 1 ? ' x' + multiplier : ''}...`, 279 | files: [{ 280 | attachment: recording, 281 | name: recordingName 282 | }], 283 | components: buttons(info.coreType, id, 1, true, info.multipliers) 284 | }); 285 | } 286 | } else { 287 | await interaction.update({ content: 'Cannot find save for this game' }); 288 | } 289 | } 290 | } catch (err) { 291 | console.error(err); 292 | } 293 | }); 294 | } 295 | 296 | const parseInput = (input: string) => { 297 | switch (toLower(input)) { 298 | case 'a': 299 | return { A: true }; 300 | case 'b': 301 | return { B: true }; 302 | case 'x': 303 | return { X: true }; 304 | case 'y': 305 | return { Y: true }; 306 | case 'l': 307 | return { L: true }; 308 | case 'r': 309 | return { R: true }; 310 | case 'up': 311 | return { UP: true }; 312 | case 'down': 313 | return { DOWN: true }; 314 | case 'left': 315 | return { LEFT: true }; 316 | case 'right': 317 | return { RIGHT: true }; 318 | case 'select': 319 | return { SELECT: true }; 320 | case 'start': 321 | return { START: true }; 322 | } 323 | }; 324 | 325 | const isNumeric = (value) => { 326 | return /^\d+$/.test(value); 327 | }; 328 | 329 | const multiplierButton = (id: string, multiplier: number, messageMultiplier: number, enabled: boolean) => { 330 | return new ButtonBuilder() 331 | .setCustomId(id + '-' + multiplier.toString() + '-' + messageMultiplier) 332 | .setEmoji(multiplier == 10 ? "🔟" : multiplier.toString() + '\u20E3') // Combining Enclosing Keycap, turns a digit into an emoji 333 | .setDisabled(!enabled) 334 | .setStyle(messageMultiplier == multiplier ? ButtonStyle.Primary : ButtonStyle.Secondary); 335 | }; 336 | 337 | const buttons = (coreType: CoreType, id: string, multiplier: number = 1, enabled: boolean = true, enabledMultipliers: Array, highlight?: string) => { 338 | const a = new ButtonBuilder() 339 | .setCustomId(id + '-' + 'a' + '-' + multiplier) 340 | .setEmoji('🇦') 341 | .setDisabled(!enabled) 342 | .setStyle(highlight == 'a' ? ButtonStyle.Success : ButtonStyle.Secondary); 343 | 344 | const b = new ButtonBuilder() 345 | .setCustomId(id + '-' + 'b' + '-' + multiplier) 346 | .setEmoji('🇧') 347 | .setDisabled(!enabled) 348 | .setStyle(highlight == 'b' ? ButtonStyle.Success : ButtonStyle.Secondary); 349 | 350 | const x = new ButtonBuilder() 351 | .setCustomId(id + '-' + 'x' + '-' + multiplier) 352 | .setEmoji('🇽') 353 | .setDisabled(!enabled) 354 | .setStyle(highlight == 'x' ? ButtonStyle.Success : ButtonStyle.Secondary); 355 | 356 | const y = new ButtonBuilder() 357 | .setCustomId(id + '-' + 'y' + '-' + multiplier) 358 | .setEmoji('🇾') 359 | .setDisabled(!enabled) 360 | .setStyle(highlight == 'y' ? ButtonStyle.Success : ButtonStyle.Secondary); 361 | 362 | const l = new ButtonBuilder() 363 | .setCustomId(id + '-' + 'l' + '-' + multiplier) 364 | .setEmoji('🇱') 365 | .setDisabled(!enabled) 366 | .setStyle(highlight == 'l' ? ButtonStyle.Success : ButtonStyle.Secondary); 367 | 368 | const r = new ButtonBuilder() 369 | .setCustomId(id + '-' + 'r' + '-' + multiplier) 370 | .setEmoji('🇷') 371 | .setDisabled(!enabled) 372 | .setStyle(highlight == 'r' ? ButtonStyle.Success : ButtonStyle.Secondary); 373 | 374 | const up = new ButtonBuilder() 375 | .setCustomId(id + '-' + 'up' + '-' + multiplier) 376 | .setEmoji('⬆️') 377 | .setDisabled(!enabled) 378 | .setStyle(highlight == 'up' ? ButtonStyle.Success : ButtonStyle.Secondary); 379 | 380 | const down = new ButtonBuilder() 381 | .setCustomId(id + '-' + 'down' + '-' + multiplier) 382 | .setEmoji('⬇️') 383 | .setDisabled(!enabled) 384 | .setStyle(highlight == 'down' ? ButtonStyle.Success : ButtonStyle.Secondary); 385 | 386 | const left = new ButtonBuilder() 387 | .setCustomId(id + '-' + 'left' + '-' + multiplier) 388 | .setEmoji('⬅️') 389 | .setDisabled(!enabled) 390 | .setStyle(highlight == 'left' ? ButtonStyle.Success : ButtonStyle.Secondary); 391 | 392 | const right = new ButtonBuilder() 393 | .setCustomId(id + '-' + 'right' + '-' + multiplier) 394 | .setEmoji('➡️') 395 | .setDisabled(!enabled) 396 | .setStyle(highlight == 'right' ? ButtonStyle.Success : ButtonStyle.Secondary); 397 | 398 | const select = new ButtonBuilder() 399 | .setCustomId(id + '-' + 'select' + '-' + multiplier) 400 | .setEmoji('⏺️') 401 | .setDisabled(!enabled) 402 | .setStyle(highlight == 'select' ? ButtonStyle.Success : ButtonStyle.Secondary); 403 | 404 | const start = new ButtonBuilder() 405 | .setCustomId(id + '-' + 'start' + '-' + multiplier) 406 | .setEmoji('▶️') 407 | .setDisabled(!enabled) 408 | .setStyle(highlight == 'start' ? ButtonStyle.Success : ButtonStyle.Secondary); 409 | 410 | const multiplierRows = []; 411 | 412 | enabledMultipliers = [...enabledMultipliers]; 413 | 414 | if (enabledMultipliers.length > 0) { 415 | multiplierRows.push( 416 | new ActionRowBuilder() 417 | .addComponents( 418 | enabledMultipliers.splice(0, 5).map((n) => multiplierButton(id, n, multiplier, enabled)) 419 | ) 420 | ); 421 | } 422 | 423 | if (enabledMultipliers.length > 0) { 424 | multiplierRows.push(new ActionRowBuilder() 425 | .addComponents( 426 | enabledMultipliers.map((n) => multiplierButton(id, n, multiplier, enabled)) 427 | ) 428 | ) 429 | } 430 | 431 | switch (coreType) { 432 | case CoreType.GB: 433 | return [ 434 | new ActionRowBuilder() 435 | .addComponents( 436 | a, b, select, start, 437 | ), 438 | new ActionRowBuilder() 439 | .addComponents( 440 | up, down, left, right 441 | ), 442 | ...multiplierRows 443 | ] as any[]; 444 | 445 | case CoreType.GBA: 446 | return [ 447 | new ActionRowBuilder() 448 | .addComponents( 449 | a, b 450 | ), 451 | new ActionRowBuilder() 452 | .addComponents( 453 | up, down, left, right 454 | ), 455 | new ActionRowBuilder() 456 | .addComponents( 457 | select, start, l, r 458 | ), 459 | ...multiplierRows 460 | ] as any[]; 461 | 462 | case CoreType.NES: 463 | return [ 464 | new ActionRowBuilder() 465 | .addComponents( 466 | a, b, select, start, 467 | ), 468 | new ActionRowBuilder() 469 | .addComponents( 470 | up, down, left, right 471 | ), 472 | ...multiplierRows 473 | ] as any[]; 474 | 475 | case CoreType.SNES: 476 | return [ 477 | new ActionRowBuilder() 478 | .addComponents( 479 | a, b, x, y 480 | ), 481 | new ActionRowBuilder() 482 | .addComponents( 483 | up, down, left, right 484 | ), 485 | new ActionRowBuilder() 486 | .addComponents( 487 | select, start, l, r 488 | ), 489 | ...multiplierRows 490 | ] as any[]; 491 | } 492 | 493 | return []; 494 | }; 495 | 496 | const inputAssistSetting = (id, info: GameInfo) => ({ 497 | content: 'Input Assist', 498 | components: [new ActionRowBuilder() 499 | .addComponents(new StringSelectMenuBuilder() 500 | .setCustomId(`settings-${id}-input_assist`) 501 | .setOptions({ 502 | label: 'Autoplay', 503 | value: InputAssist.Autoplay, 504 | default: info.inputAssist == InputAssist.Autoplay 505 | }, { 506 | label: 'Wait', 507 | value: InputAssist.Wait, 508 | default: info.inputAssist == InputAssist.Wait 509 | }, { 510 | label: 'Off', 511 | value: InputAssist.Off, 512 | default: info.inputAssist == InputAssist.Off 513 | }))] 514 | }) 515 | 516 | const inputAssistSpeedSetting = (id, info: GameInfo) => ({ 517 | content: 'Input Assist Speed', 518 | components: [new ActionRowBuilder() 519 | .addComponents(new StringSelectMenuBuilder() 520 | .setCustomId(`settings-${id}-input_assist_speed`) 521 | .setOptions({ 522 | label: 'Fast', 523 | value: InputAssistSpeed.Fast, 524 | default: info.inputAssistSpeed == InputAssistSpeed.Fast 525 | }, { 526 | label: 'Normal', 527 | value: InputAssistSpeed.Normal, 528 | default: info.inputAssistSpeed == InputAssistSpeed.Normal 529 | }, { 530 | label: 'Slow', 531 | value: InputAssistSpeed.Slow, 532 | default: info.inputAssistSpeed == InputAssistSpeed.Slow 533 | }))] 534 | }) 535 | 536 | const directionPressSetting = (id, info: GameInfo) => ({ 537 | content: 'Directional Press', 538 | components: [new ActionRowBuilder() 539 | .addComponents(new StringSelectMenuBuilder() 540 | .setCustomId(`settings-${id}-direction_press`) 541 | .setOptions({ 542 | label: 'Release', 543 | value: DirectionPress.Release, 544 | default: info.directionPress == DirectionPress.Release 545 | }, { 546 | label: 'Hold', 547 | value: DirectionPress.Hold, 548 | default: info.directionPress == DirectionPress.Hold 549 | }))] 550 | }) 551 | 552 | const multiplierSetting = (id, info: GameInfo) => ({ 553 | content: 'Enabled Multipliers', 554 | components: [new ActionRowBuilder() 555 | .addComponents( 556 | multiplierButton(`settings-${id}-multiplier`, 1, 0, true).setStyle(info.multipliers.includes(1) ? ButtonStyle.Primary : ButtonStyle.Secondary), 557 | multiplierButton(`settings-${id}-multiplier`, 2, 0, true).setStyle(info.multipliers.includes(2) ? ButtonStyle.Primary : ButtonStyle.Secondary), 558 | multiplierButton(`settings-${id}-multiplier`, 3, 0, true).setStyle(info.multipliers.includes(3) ? ButtonStyle.Primary : ButtonStyle.Secondary), 559 | multiplierButton(`settings-${id}-multiplier`, 4, 0, true).setStyle(info.multipliers.includes(4) ? ButtonStyle.Primary : ButtonStyle.Secondary), 560 | multiplierButton(`settings-${id}-multiplier`, 5, 0, true).setStyle(info.multipliers.includes(5) ? ButtonStyle.Primary : ButtonStyle.Secondary), 561 | ), 562 | new ActionRowBuilder() 563 | .addComponents( 564 | multiplierButton(`settings-${id}-multiplier`, 6, 0, true).setStyle(info.multipliers.includes(6) ? ButtonStyle.Primary : ButtonStyle.Secondary), 565 | multiplierButton(`settings-${id}-multiplier`, 7, 0, true).setStyle(info.multipliers.includes(7) ? ButtonStyle.Primary : ButtonStyle.Secondary), 566 | multiplierButton(`settings-${id}-multiplier`, 8, 0, true).setStyle(info.multipliers.includes(8) ? ButtonStyle.Primary : ButtonStyle.Secondary), 567 | multiplierButton(`settings-${id}-multiplier`, 9, 0, true).setStyle(info.multipliers.includes(9) ? ButtonStyle.Primary : ButtonStyle.Secondary), 568 | multiplierButton(`settings-${id}-multiplier`, 10, 0, true).setStyle(info.multipliers.includes(10) ? ButtonStyle.Primary : ButtonStyle.Secondary), 569 | ) 570 | ] 571 | }) 572 | 573 | const settingsForm = (id: string, info: GameInfo): BaseMessageOptions[] => ([ 574 | inputAssistSetting(id, info), 575 | inputAssistSpeedSetting(id, info), 576 | directionPressSetting(id, info), 577 | multiplierSetting(id, info) 578 | ]); 579 | 580 | const joyToWord = (input: InputState) => { 581 | if (input.A) return 'A'; 582 | if (input.B) return 'B'; 583 | if (input.X) return 'X'; 584 | if (input.Y) return 'Y'; 585 | if (input.L) return 'L'; 586 | if (input.R) return 'R'; 587 | if (input.UP) return 'Up'; 588 | if (input.DOWN) return 'Down'; 589 | if (input.LEFT) return 'Left'; 590 | if (input.RIGHT) return 'Right'; 591 | if (input.START) return 'Start'; 592 | if (input.SELECT) return 'Select'; 593 | } 594 | 595 | const findMostRecentGame = async (client: Client, channelId: string): Promise<{ id: string, message: Message, channel: TextChannel }> => { 596 | const channel = await client.channels.fetch(channelId) as TextChannel; 597 | const messages = await channel.messages.fetch({ limit: 100 }); 598 | 599 | for (const message of messages.values()) { 600 | if (message.author.id == client.user.id) { 601 | const button = message.components.find(component => component.type == ComponentType.ActionRow)?.components 602 | ?.find(component => component.type == ComponentType.Button); 603 | 604 | if (button) { 605 | const id = first(split(button?.customId, '-')); 606 | 607 | if (isGameId(id)) { 608 | return { id, message, channel }; 609 | } 610 | } 611 | } 612 | } 613 | 614 | return null; 615 | } 616 | 617 | const unlockGames = async (client: Client) => { 618 | const infoIds = (await glob('data/*/info.json')).map(dir => dir.split(/[\\\/]/).at(-2)); 619 | const infos = reduce(infoIds, (acc, id) => ({ 620 | ...acc, 621 | [id]: getGameInfo(id) 622 | }), {} as { [id: string]: GameInfo }); 623 | 624 | const channelIds: string[] = uniq(reduce(infos, (acc, info) => [...acc, info.channelId], [])); 625 | 626 | for (const channelId of channelIds) { 627 | try { 628 | const result = await findMostRecentGame(client, channelId); 629 | if (result) { 630 | const { id, message, channel } = result; 631 | const info = infos[id]; 632 | 633 | if (info) { 634 | console.log(`unlocking ${info.game} in ${channel.name}`); 635 | await message.edit({ components: buttons(info.coreType, id, 1, true, info.multipliers) }); 636 | } 637 | } 638 | } catch (err) { 639 | console.log(err); 640 | } 641 | } 642 | } 643 | 644 | const detectCore = (filename: string): CoreType => { 645 | if (NES.find(ext => endsWith(toLower(filename), ext))) 646 | return CoreType.NES; 647 | 648 | if (SNES.find(ext => endsWith(toLower(filename), ext))) 649 | return CoreType.SNES; 650 | 651 | if (GB.find(ext => endsWith(toLower(filename), ext))) 652 | return CoreType.GB; 653 | 654 | if (GBA.find(ext => endsWith(toLower(filename), ext))) 655 | return CoreType.GBA; 656 | } 657 | 658 | main().catch(err => { 659 | console.error(err); 660 | process.exit(1); 661 | }); 662 | -------------------------------------------------------------------------------- /src/mgba_libretro_emscripten.bc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/src/mgba_libretro_emscripten.bc -------------------------------------------------------------------------------- /src/quicknes_libretro_emscripten.bc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/src/quicknes_libretro_emscripten.bc -------------------------------------------------------------------------------- /src/snes9x2010_libretro_emscripten.bc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rossimo/retrobot/54f00c30055e7b1c3262fd5115f93a7245e3352f/src/snes9x2010_libretro_emscripten.bc -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | export const loadRom = (core: any, data: ArrayBufferLike) => { 4 | const pointer = core.asm.malloc(data.byteLength); 5 | const heap = new Uint8Array(core.HEAPU8.buffer, pointer, data.byteLength); 6 | heap.set(new Uint8Array(data)); 7 | 8 | const result = core.retro_load_game({ data: pointer, size: data.byteLength }); 9 | //core.asm.free(pointer); 10 | 11 | if (!result) { 12 | throw new Error('Unable to load game'); 13 | } 14 | } 15 | 16 | export const loadState = (core: any, state: ArrayBufferLike) => { 17 | const size = core.retro_serialize_size(); 18 | const pointer = core.asm.malloc(size); 19 | const heap = new Uint8Array(core.HEAPU8.buffer, pointer, size); 20 | heap.set(new Uint8Array(new Uint8Array(state).slice(0, size))); 21 | 22 | const result = core.retro_unserialize(pointer, size); 23 | core.asm.free(pointer); 24 | 25 | if (!result) { 26 | throw new Error('Unable to load state'); 27 | } 28 | } 29 | 30 | export const saveState = (core: any) => { 31 | const size = core.retro_serialize_size(); 32 | const pointer = core.asm.malloc(size); 33 | 34 | const result = core.retro_serialize(pointer, size); 35 | const data = new Uint8Array(new Uint8Array(core.HEAPU8.buffer, pointer, size)); 36 | core.asm.free(pointer); 37 | 38 | if (!result) { 39 | throw new Error('Unable to save state'); 40 | } 41 | 42 | return data; 43 | } 44 | 45 | export interface Frame { 46 | buffer: Uint16Array 47 | width: number 48 | height: number 49 | pitch: number 50 | } 51 | 52 | export interface InputState { 53 | UP?: boolean 54 | RIGHT?: boolean 55 | DOWN?: boolean 56 | LEFT?: boolean 57 | A?: boolean 58 | B?: boolean 59 | X?: boolean 60 | Y?: boolean 61 | L?: boolean 62 | R?: boolean 63 | SELECT?: boolean 64 | START?: boolean 65 | } 66 | 67 | export interface Recording { 68 | quality: number 69 | tmpDir: string 70 | maxFramerate: number 71 | executedFrameCount: number 72 | frames: Promise<{ file: string, frameNumber: number }>[] 73 | lastFrame: Frame 74 | lastRecordedBufferHash: any 75 | framesSinceRecord: number 76 | width: number 77 | height: number 78 | } 79 | 80 | export const rgb565toRaw = ({ width, height, pitch, buffer }: Frame) => { 81 | const raw = new Uint8Array(width * height * 4); 82 | 83 | for (let y = 0; y < height; y++) { 84 | for (let x = 0; x < width; x++) { 85 | const pixel = buffer[(pitch * y) / 2 + x]; 86 | 87 | const r = (pixel >> 8) & 0xF8; 88 | const g = (pixel >> 3) & 0xFC; 89 | const b = (pixel) << 3; 90 | 91 | const i = (x + width * y) * 4; 92 | raw[i] = r; 93 | raw[i + 1] = g; 94 | raw[i + 2] = b; 95 | raw[i + 3] = 255; 96 | } 97 | } 98 | 99 | return raw; 100 | } 101 | 102 | export const arraysEqual = (a: Uint16Array, b: Uint16Array) => { 103 | if (a?.length != b?.length) { 104 | return false; 105 | } 106 | 107 | for (let i = 0; i < a.length; i++) { 108 | if (a[i] != b[i]) { 109 | return false; 110 | } 111 | } 112 | 113 | return true; 114 | } 115 | 116 | export const isDirection = (input?: InputState) => { 117 | if (input?.UP) return true; 118 | if (input?.DOWN) return true; 119 | if (input?.LEFT) return true; 120 | if (input?.RIGHT) return true; 121 | return false; 122 | } -------------------------------------------------------------------------------- /src/worker.ts: -------------------------------------------------------------------------------- 1 | import Piscina from 'piscina'; 2 | import { CoreType } from './emulate'; 3 | import { crc32c } from 'hash-wasm'; 4 | import { InputState, loadRom, loadState, saveState } from './util'; 5 | 6 | export const RETRO_DEVICE_ID_JOYPAD_B = 0; 7 | export const RETRO_DEVICE_ID_JOYPAD_Y = 1; 8 | export const RETRO_DEVICE_ID_JOYPAD_SELECT = 2; 9 | export const RETRO_DEVICE_ID_JOYPAD_START = 3; 10 | export const RETRO_DEVICE_ID_JOYPAD_UP = 4; 11 | export const RETRO_DEVICE_ID_JOYPAD_DOWN = 5; 12 | export const RETRO_DEVICE_ID_JOYPAD_LEFT = 6; 13 | export const RETRO_DEVICE_ID_JOYPAD_RIGHT = 7; 14 | export const RETRO_DEVICE_ID_JOYPAD_A = 8; 15 | export const RETRO_DEVICE_ID_JOYPAD_X = 9; 16 | export const RETRO_DEVICE_ID_JOYPAD_L = 10; 17 | export const RETRO_DEVICE_ID_JOYPAD_R = 11; 18 | export const RETRO_DEVICE_ID_JOYPAD_L2 = 12; 19 | export const RETRO_DEVICE_ID_JOYPAD_R2 = 13; 20 | export const RETRO_DEVICE_ID_JOYPAD_L3 = 14; 21 | export const RETRO_DEVICE_ID_JOYPAD_R3 = 15; 22 | 23 | export const RETRO_DEVICE_ID_JOYPAD_MASK = 256; 24 | 25 | type Core = any 26 | 27 | export interface Frame { 28 | buffer: Uint16Array 29 | width: number 30 | height: number 31 | pitch: number 32 | } 33 | 34 | export interface WorkerData { 35 | input: InputState 36 | duration: number 37 | coreType: CoreType 38 | game: Buffer 39 | state: Buffer 40 | gameHash?: string 41 | stateHash?: string 42 | } 43 | 44 | const NesCore = require('../cores/quicknes_libretro'); 45 | const SnesCore = require('../cores/snes9x2010_libretro'); 46 | const GbCore = require('../cores/mgba_libretro'); 47 | 48 | let lastGbGameHash = ''; 49 | let lastNesGameHash = ''; 50 | let lastSnesGameHash = ''; 51 | 52 | let lastGbStateHash = ''; 53 | let lastNesStateHash = ''; 54 | let lastSnesStateHash = ''; 55 | 56 | const setup = (core: Core) => { 57 | core.retro_set_environment((cmd: number, data: any) => { 58 | if (cmd == 3) { 59 | core.HEAPU8[data] = 1; 60 | return true; 61 | } 62 | 63 | if (cmd == (51 | 0x10000)) { 64 | return true; 65 | } 66 | 67 | if (cmd == 10) { 68 | return true; 69 | } 70 | 71 | return false; 72 | }); 73 | 74 | return core; 75 | }; 76 | 77 | let nesCoreInit: Promise; 78 | let snesCoreInit: Promise; 79 | let gbCoreInit: Promise; 80 | 81 | export default async (data: WorkerData) => { 82 | const { coreType, input, duration, game, state, gameHash, stateHash } = data; 83 | 84 | let core: Core; 85 | switch (coreType) { 86 | case CoreType.NES: 87 | core = await (nesCoreInit = nesCoreInit || NesCore().then(setup)); 88 | break; 89 | 90 | case CoreType.SNES: 91 | core = await (snesCoreInit = snesCoreInit || SnesCore().then(setup)); 92 | break; 93 | 94 | case CoreType.GBA: 95 | case CoreType.GB: 96 | core = await (gbCoreInit = gbCoreInit || GbCore().then(setup)); 97 | break; 98 | 99 | default: 100 | throw new Error(`Unknown core type: ${coreType}`); 101 | } 102 | 103 | const incomingGameHash = gameHash 104 | ? gameHash 105 | : await crc32c(game); 106 | 107 | let lastGameHash = ''; 108 | 109 | switch (coreType) { 110 | case CoreType.NES: 111 | lastGameHash = lastNesGameHash; 112 | break; 113 | 114 | case CoreType.SNES: 115 | lastGameHash = lastSnesGameHash; 116 | break; 117 | 118 | case CoreType.GBA: 119 | case CoreType.GB: 120 | lastGameHash = lastGbGameHash; 121 | break; 122 | } 123 | 124 | if (incomingGameHash != lastGameHash || state?.byteLength == 0) { 125 | loadRom(core, game); 126 | 127 | switch (coreType) { 128 | case CoreType.NES: 129 | lastNesGameHash = incomingGameHash; 130 | break; 131 | 132 | case CoreType.SNES: 133 | lastSnesGameHash = incomingGameHash; 134 | break; 135 | 136 | case CoreType.GBA: 137 | case CoreType.GB: 138 | lastGbGameHash = incomingGameHash; 139 | break; 140 | } 141 | } 142 | 143 | const av_info: any = {}; 144 | core.retro_get_system_av_info(av_info); 145 | 146 | { 147 | const incomingStateHash = stateHash 148 | ? stateHash 149 | : await crc32c(state); 150 | 151 | let lastStateHash: string; 152 | switch (coreType) { 153 | case CoreType.NES: 154 | lastStateHash = lastNesStateHash; 155 | break; 156 | 157 | case CoreType.SNES: 158 | lastStateHash = lastSnesStateHash; 159 | break; 160 | 161 | case CoreType.GBA: 162 | case CoreType.GB: 163 | lastStateHash = lastGbStateHash; 164 | break; 165 | } 166 | 167 | if (state?.byteLength > 0 && lastStateHash != incomingStateHash) { 168 | loadState(core, state); 169 | } 170 | } 171 | 172 | core.retro_set_input_state((port: number, device: number, index: number, id: number) => { 173 | if (id == RETRO_DEVICE_ID_JOYPAD_MASK) { 174 | let mask = 0; 175 | 176 | if (input.A) 177 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_A; 178 | 179 | if (input.B) 180 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_B; 181 | 182 | if (input.X) 183 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_X; 184 | 185 | if (input.Y) 186 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_Y; 187 | 188 | if (input.SELECT) 189 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_SELECT; 190 | 191 | if (input.START) 192 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_START; 193 | 194 | if (input.UP) 195 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_UP; 196 | 197 | if (input.DOWN) 198 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_DOWN; 199 | 200 | if (input.LEFT) 201 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_LEFT; 202 | 203 | if (input.RIGHT) 204 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_RIGHT; 205 | 206 | if (input.L) 207 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_L; 208 | 209 | if (input.R) 210 | mask |= 1 << RETRO_DEVICE_ID_JOYPAD_R; 211 | 212 | return mask; 213 | } 214 | 215 | return 0; 216 | }); 217 | 218 | let callback: (frame: Frame) => void; 219 | core.retro_set_video_refresh((data: number, width: number, height: number, pitch: number) => { 220 | callback({ 221 | buffer: data 222 | ? new Uint16Array(core.HEAPU16.subarray(data / 2, (data + pitch * height) / 2)) 223 | : null, 224 | width, 225 | height, 226 | pitch 227 | }); 228 | }); 229 | 230 | const executeFrame = () => new Promise((res) => { 231 | callback = res; 232 | core.retro_run(); 233 | }); 234 | 235 | const frames: Frame[] = []; 236 | 237 | for (let i = 0; i < duration; i++) { 238 | frames.push(await executeFrame()); 239 | } 240 | 241 | const newState = saveState(core); 242 | const newStateHash = await crc32c(newState); 243 | 244 | switch (coreType) { 245 | case CoreType.NES: 246 | lastNesStateHash = newStateHash; 247 | break; 248 | 249 | case CoreType.SNES: 250 | lastSnesStateHash = newStateHash; 251 | break; 252 | 253 | case CoreType.GBA: 254 | case CoreType.GB: 255 | lastGbStateHash = newStateHash; 256 | break; 257 | } 258 | 259 | const output = { 260 | av_info, 261 | frames, 262 | state: newState, 263 | gameHash: incomingGameHash, 264 | stateHash: newStateHash, 265 | 266 | get [Piscina.transferableSymbol]() { 267 | return [ 268 | newState.buffer, 269 | ...frames.map(frame => frame.buffer.buffer) 270 | ]; 271 | }, 272 | 273 | get [Piscina.valueSymbol]() { 274 | return { 275 | av_info, 276 | frames, 277 | state: newState, 278 | gameHash: incomingGameHash, 279 | stateHash: newStateHash 280 | }; 281 | } 282 | }; 283 | 284 | return Piscina.move(output as any); 285 | } -------------------------------------------------------------------------------- /src/workerInterface.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import Piscina from 'piscina'; 3 | import EventEmitter from 'events'; 4 | 5 | import { InputState } from './util'; 6 | import { CoreType } from './emulate'; 7 | import { Frame } from './worker'; 8 | 9 | export const emulateParallel = async (pool: Piscina, data: { coreType: CoreType, game: Uint8Array, state: Uint8Array, frames: Frame[], gameHash?: string, stateHash?: string }, options: { input: InputState, duration: number }, signal?: EventEmitter) => { 10 | let { coreType, game, state, frames, gameHash, stateHash } = data; 11 | let { input, duration } = options; 12 | 13 | let gameCopy = new Uint8Array(game); 14 | let stateCopy = new Uint8Array(state); 15 | 16 | const result = await pool.run( 17 | { 18 | coreType, 19 | input, 20 | duration, 21 | game: gameCopy, 22 | state: stateCopy, 23 | gameHash, 24 | stateHash 25 | }, 26 | { 27 | transferList: [ 28 | gameCopy?.buffer || new ArrayBuffer(0), 29 | stateCopy?.buffer || new ArrayBuffer(0) 30 | ], 31 | signal 32 | }); 33 | 34 | return { 35 | coreType, 36 | game, 37 | state: result.state, 38 | frames: [...frames, ...result.frames], 39 | av_info: result.av_info, 40 | gameHash: result.gameHash, 41 | stateHash: result.stateHash 42 | }; 43 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "commonjs", 5 | "outDir": "out", 6 | "sourceMap": true, 7 | "esModuleInterop": true 8 | } 9 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@assemblyscript/loader@^0.10.1": 6 | version "0.10.1" 7 | resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz" 8 | integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== 9 | 10 | "@colors/colors@1.5.0": 11 | version "1.5.0" 12 | resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" 13 | integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== 14 | 15 | "@cspotcode/source-map-support@^0.8.0": 16 | version "0.8.1" 17 | resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" 18 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 19 | dependencies: 20 | "@jridgewell/trace-mapping" "0.3.9" 21 | 22 | "@dabh/diagnostics@^2.0.2": 23 | version "2.0.3" 24 | resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" 25 | integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== 26 | dependencies: 27 | colorspace "1.1.x" 28 | enabled "2.0.x" 29 | kuler "^2.0.0" 30 | 31 | "@discordjs/builders@^1.6.0": 32 | version "1.6.1" 33 | resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.1.tgz" 34 | integrity sha512-CCcLwn/8ANhlAbhlE18fcaN0hfXTen53/JiwZs1t9oE/Cqa9maA8ZRarkCIsXF4J7J/MYnd0J6IsxeKsq+f6mw== 35 | dependencies: 36 | "@discordjs/formatters" "^0.3.0" 37 | "@discordjs/util" "^0.2.0" 38 | "@sapphire/shapeshift" "^3.8.1" 39 | discord-api-types "^0.37.37" 40 | fast-deep-equal "^3.1.3" 41 | ts-mixer "^6.0.3" 42 | tslib "^2.5.0" 43 | 44 | "@discordjs/collection@^1.5.0": 45 | version "1.5.0" 46 | resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.0.tgz" 47 | integrity sha512-suyVndkEAAWrGxyw/CPGdtXoRRU6AUNkibtnbJevQzpelkJh3Q1gQqWDpqf5i39CnAn5+LrN0YS+cULeEjq2Yw== 48 | 49 | "@discordjs/formatters@^0.3.0": 50 | version "0.3.0" 51 | resolved "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.0.tgz" 52 | integrity sha512-Fc4MomalbP8HMKEMor3qUiboAKDtR7PSBoPjwm7WYghVRwgJlj5WYvUsriLsxeKk8+Qq2oy+HJlGTUkGvX0YnA== 53 | dependencies: 54 | discord-api-types "^0.37.37" 55 | 56 | "@discordjs/rest@^1.7.0": 57 | version "1.7.0" 58 | resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.0.tgz" 59 | integrity sha512-r2HzmznRIo8IDGYBWqQfkEaGN1LrFfWQd3dSyC4tOpMU8nuVvFUEw6V/lwnG44jyOq+vgyDny2fxeUDMt9I4aQ== 60 | dependencies: 61 | "@discordjs/collection" "^1.5.0" 62 | "@discordjs/util" "^0.2.0" 63 | "@sapphire/async-queue" "^1.5.0" 64 | "@sapphire/snowflake" "^3.4.0" 65 | discord-api-types "^0.37.37" 66 | file-type "^18.2.1" 67 | tslib "^2.5.0" 68 | undici "^5.21.0" 69 | 70 | "@discordjs/util@^0.2.0": 71 | version "0.2.0" 72 | resolved "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz" 73 | integrity sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg== 74 | 75 | "@ffmpeg-installer/darwin-arm64@4.1.5": 76 | version "4.1.5" 77 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz#b7b5c262dd96d1aea4807514e1cdcf6e11f82743" 78 | integrity sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA== 79 | 80 | "@ffmpeg-installer/darwin-x64@4.1.0": 81 | version "4.1.0" 82 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz#48e1706c690e628148482bfb64acb67472089aaa" 83 | integrity sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw== 84 | 85 | "@ffmpeg-installer/ffmpeg@^1.1.0": 86 | version "1.1.0" 87 | resolved "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz" 88 | integrity sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg== 89 | optionalDependencies: 90 | "@ffmpeg-installer/darwin-arm64" "4.1.5" 91 | "@ffmpeg-installer/darwin-x64" "4.1.0" 92 | "@ffmpeg-installer/linux-arm" "4.1.3" 93 | "@ffmpeg-installer/linux-arm64" "4.1.4" 94 | "@ffmpeg-installer/linux-ia32" "4.1.0" 95 | "@ffmpeg-installer/linux-x64" "4.1.0" 96 | "@ffmpeg-installer/win32-ia32" "4.1.0" 97 | "@ffmpeg-installer/win32-x64" "4.1.0" 98 | 99 | "@ffmpeg-installer/linux-arm64@4.1.4": 100 | version "4.1.4" 101 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz#7219f3f901bb67f7926cb060b56b6974a6cad29f" 102 | integrity sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg== 103 | 104 | "@ffmpeg-installer/linux-arm@4.1.3": 105 | version "4.1.3" 106 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz#c554f105ed5f10475ec25d7bec94926ce18db4c1" 107 | integrity sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg== 108 | 109 | "@ffmpeg-installer/linux-ia32@4.1.0": 110 | version "4.1.0" 111 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz#adad70b0d0d9d8d813983d6e683c5a338a75e442" 112 | integrity sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ== 113 | 114 | "@ffmpeg-installer/linux-x64@4.1.0": 115 | version "4.1.0" 116 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz#b4a5d89c4e12e6d9306dbcdc573df716ec1c4323" 117 | integrity sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A== 118 | 119 | "@ffmpeg-installer/win32-ia32@4.1.0": 120 | version "4.1.0" 121 | resolved "https://registry.yarnpkg.com/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz#6eac4fb691b64c02e7a116c1e2d167f3e9b40638" 122 | integrity sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw== 123 | 124 | "@ffmpeg-installer/win32-x64@4.1.0": 125 | version "4.1.0" 126 | resolved "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz" 127 | integrity sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg== 128 | 129 | "@ffprobe-installer/darwin-arm64@5.0.1": 130 | version "5.0.1" 131 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/darwin-arm64/-/darwin-arm64-5.0.1.tgz#a020a623955d55aa8daf45cb668c3044876b553b" 132 | integrity sha512-vwNCNjokH8hfkbl6m95zICHwkSzhEvDC3GVBcUp5HX8+4wsX10SP3B+bGur7XUzTIZ4cQpgJmEIAx6TUwRepMg== 133 | 134 | "@ffprobe-installer/darwin-x64@5.0.0": 135 | version "5.0.0" 136 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/darwin-x64/-/darwin-x64-5.0.0.tgz#66116b642cb1759939f4f4b3b18b0aea5d7814b0" 137 | integrity sha512-Zl0UkZ+wW/eyMKBPLTUCcNQch2VDnZz/cBn1DXv3YtCBVbYd9aYzGj4MImdxgWcoE0+GpbfbO6mKGwMq5HCm6A== 138 | 139 | "@ffprobe-installer/ffprobe@^1.4.1": 140 | version "1.4.1" 141 | resolved "https://registry.npmjs.org/@ffprobe-installer/ffprobe/-/ffprobe-1.4.1.tgz" 142 | integrity sha512-3WJvxU0f4d7IOZdzoVCAj9fYtiQNC6E0521FJFe9iP5Ej8auTXU7TsrUzIAG1CydeQI+BnM3vGog92SCcF9KtA== 143 | optionalDependencies: 144 | "@ffprobe-installer/darwin-arm64" "5.0.1" 145 | "@ffprobe-installer/darwin-x64" "5.0.0" 146 | "@ffprobe-installer/linux-arm" "5.0.0" 147 | "@ffprobe-installer/linux-arm64" "5.0.0" 148 | "@ffprobe-installer/linux-ia32" "5.0.0" 149 | "@ffprobe-installer/linux-x64" "5.0.0" 150 | "@ffprobe-installer/win32-ia32" "5.0.0" 151 | "@ffprobe-installer/win32-x64" "5.0.0" 152 | 153 | "@ffprobe-installer/linux-arm64@5.0.0": 154 | version "5.0.0" 155 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/linux-arm64/-/linux-arm64-5.0.0.tgz#8e50c2ac0fa9f1ccaf553114c09cc9d2f9571de2" 156 | integrity sha512-IwFbzhe1UydR849YXLPP0RMpHgHXSuPO1kznaCHcU5FscFBV5gOZLkdD8e/xrcC8g/nhKqy0xMjn5kv6KkFQlQ== 157 | 158 | "@ffprobe-installer/linux-arm@5.0.0": 159 | version "5.0.0" 160 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/linux-arm/-/linux-arm-5.0.0.tgz#0a67b1610284e4be115da1656f150abc4706fe08" 161 | integrity sha512-mM1PPxP2UX5SUvhy0urcj5U8UolwbYgmnXA/eBWbW78k6N2Wk1COvcHYzOPs6c5yXXL6oshS2rZHU1kowigw7g== 162 | 163 | "@ffprobe-installer/linux-ia32@5.0.0": 164 | version "5.0.0" 165 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/linux-ia32/-/linux-ia32-5.0.0.tgz#38714de93ce3842887e51a8b0c9dab3297777dbb" 166 | integrity sha512-c3bWlWEDMST59SAZycVh0oyc2eNS/CxxeRjoNryGRgqcZX3EJWJJQL1rAXbpQOMLMi8to1RqnmMuwPJgLLjjUA== 167 | 168 | "@ffprobe-installer/linux-x64@5.0.0": 169 | version "5.0.0" 170 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/linux-x64/-/linux-x64-5.0.0.tgz#dc51a99acf74675035c02f59c4d73270ba3742f7" 171 | integrity sha512-zgLnWJFvMGCaw1txGtz84sMEQt6mQUzdw86ih9S/kZOWnp06Gj/ams/EXxEkAxgAACCVM6/O0mkDe/6biY5tgA== 172 | 173 | "@ffprobe-installer/win32-ia32@5.0.0": 174 | version "5.0.0" 175 | resolved "https://registry.yarnpkg.com/@ffprobe-installer/win32-ia32/-/win32-ia32-5.0.0.tgz#77f5cfba1aa91e47255562d23a07432b3e087bb1" 176 | integrity sha512-NnDdAZD6ShFXzJeCkAFl2ZjAv7GcJWYudLA+0T/vjZwvskBop+sq1PGfdmVltfFDcdQiomoThRhn9Xiy9ZC71g== 177 | 178 | "@ffprobe-installer/win32-x64@5.0.0": 179 | version "5.0.0" 180 | resolved "https://registry.npmjs.org/@ffprobe-installer/win32-x64/-/win32-x64-5.0.0.tgz" 181 | integrity sha512-P4ZMRFxVMnfMsOyTfBM/+nkTodLeOUfXNPo+X1bKEWBiZxRErqX/IHS5sLA0yAH8XmtKZcL7Cu6M26ztGcQYxw== 182 | 183 | "@jridgewell/resolve-uri@^3.0.3": 184 | version "3.1.0" 185 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" 186 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 187 | 188 | "@jridgewell/sourcemap-codec@^1.4.10": 189 | version "1.4.14" 190 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" 191 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 192 | 193 | "@jridgewell/trace-mapping@0.3.9": 194 | version "0.3.9" 195 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" 196 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 197 | dependencies: 198 | "@jridgewell/resolve-uri" "^3.0.3" 199 | "@jridgewell/sourcemap-codec" "^1.4.10" 200 | 201 | "@nodelib/fs.scandir@2.1.5": 202 | version "2.1.5" 203 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 204 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 205 | dependencies: 206 | "@nodelib/fs.stat" "2.0.5" 207 | run-parallel "^1.1.9" 208 | 209 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 210 | version "2.0.5" 211 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 212 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 213 | 214 | "@nodelib/fs.walk@^1.2.3": 215 | version "1.2.8" 216 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 217 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 218 | dependencies: 219 | "@nodelib/fs.scandir" "2.1.5" 220 | fastq "^1.6.0" 221 | 222 | "@sapphire/async-queue@^1.5.0": 223 | version "1.5.0" 224 | resolved "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz" 225 | integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== 226 | 227 | "@sapphire/shapeshift@^3.8.1": 228 | version "3.8.2" 229 | resolved "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.2.tgz" 230 | integrity sha512-NXpnJAsxN3/h9TqQPntOeVWZrpIuucqXI3IWF6tj2fWCoRLCuVK5wx7Dtg7pRrtkYfsMUbDqgKoX26vrC5iYfA== 231 | dependencies: 232 | fast-deep-equal "^3.1.3" 233 | lodash "^4.17.21" 234 | 235 | "@sapphire/snowflake@^3.4.0": 236 | version "3.4.2" 237 | resolved "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.2.tgz" 238 | integrity sha512-KJwlv5gkGjs1uFV7/xx81n3tqgBwBJvH94n1xDyH3q+JSmtsMeSleJffarEBfG2yAFeJiFA4BnGOK6FFPHc19g== 239 | 240 | "@tokenizer/token@^0.3.0": 241 | version "0.3.0" 242 | resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz" 243 | integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== 244 | 245 | "@tsconfig/node10@^1.0.7": 246 | version "1.0.9" 247 | resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" 248 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 249 | 250 | "@tsconfig/node12@^1.0.7": 251 | version "1.0.11" 252 | resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" 253 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 254 | 255 | "@tsconfig/node14@^1.0.0": 256 | version "1.0.3" 257 | resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" 258 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 259 | 260 | "@tsconfig/node16@^1.0.2": 261 | version "1.0.3" 262 | resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" 263 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 264 | 265 | "@types/decompress@^4.2.4": 266 | version "4.2.4" 267 | resolved "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.4.tgz" 268 | integrity sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA== 269 | dependencies: 270 | "@types/node" "*" 271 | 272 | "@types/fluent-ffmpeg@^2.1.20": 273 | version "2.1.20" 274 | resolved "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.20.tgz" 275 | integrity sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg== 276 | dependencies: 277 | "@types/node" "*" 278 | 279 | "@types/glob@*": 280 | version "7.2.0" 281 | resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" 282 | integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== 283 | dependencies: 284 | "@types/minimatch" "*" 285 | "@types/node" "*" 286 | 287 | "@types/lodash@^4.14.184": 288 | version "4.14.184" 289 | resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz" 290 | integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q== 291 | 292 | "@types/lru-cache@^7.10.10": 293 | version "7.10.10" 294 | resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-7.10.10.tgz" 295 | integrity sha512-nEpVRPWW9EBmx2SCfNn3ClYxPL7IktPX12HhIoSc/H5mMjdeW3+YsXIpseLQ2xF35+OcpwKQbEUw5VtqE4PDNA== 296 | dependencies: 297 | lru-cache "*" 298 | 299 | "@types/md5@^2.3.2": 300 | version "2.3.2" 301 | resolved "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz" 302 | integrity sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og== 303 | 304 | "@types/minimatch@*": 305 | version "5.1.0" 306 | resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.0.tgz" 307 | integrity sha512-0RJHq5FqDWo17kdHe+SMDJLfxmLaqHbWnqZ6gNKzDvStUlrmx/eKIY17+ifLS1yybo7X86aUshQMlittDOVNnw== 308 | 309 | "@types/node@*", "@types/node@^18.7.8": 310 | version "18.7.13" 311 | resolved "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz" 312 | integrity sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw== 313 | 314 | "@types/sharp@^0.30.5": 315 | version "0.30.5" 316 | resolved "https://registry.npmjs.org/@types/sharp/-/sharp-0.30.5.tgz" 317 | integrity sha512-EhO29617AIBqxoVtpd1qdBanWpspk/kD2B6qTFRJ31Q23Rdf+DNU1xlHSwtqvwq1vgOqBwq1i38SX+HGCymIQg== 318 | dependencies: 319 | "@types/node" "*" 320 | 321 | "@types/shelljs@^0.8.11": 322 | version "0.8.11" 323 | resolved "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.11.tgz" 324 | integrity sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw== 325 | dependencies: 326 | "@types/glob" "*" 327 | "@types/node" "*" 328 | 329 | "@types/tmp@^0.2.3": 330 | version "0.2.3" 331 | resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz" 332 | integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== 333 | 334 | "@types/uuid@^8.3.4": 335 | version "8.3.4" 336 | resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" 337 | integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== 338 | 339 | "@types/ws@^8.5.4": 340 | version "8.5.4" 341 | resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" 342 | integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== 343 | dependencies: 344 | "@types/node" "*" 345 | 346 | acorn-walk@^8.1.1: 347 | version "8.2.0" 348 | resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" 349 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 350 | 351 | acorn@^8.4.1: 352 | version "8.8.0" 353 | resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" 354 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 355 | 356 | anymatch@^2.0.0: 357 | version "2.0.0" 358 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" 359 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 360 | dependencies: 361 | micromatch "^3.1.4" 362 | normalize-path "^2.1.1" 363 | 364 | arg@^4.1.0: 365 | version "4.1.3" 366 | resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" 367 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 368 | 369 | arr-diff@^4.0.0: 370 | version "4.0.0" 371 | resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" 372 | integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== 373 | 374 | arr-flatten@^1.1.0: 375 | version "1.1.0" 376 | resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" 377 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 378 | 379 | arr-union@^3.1.0: 380 | version "3.1.0" 381 | resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" 382 | integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== 383 | 384 | array-unique@^0.3.2: 385 | version "0.3.2" 386 | resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" 387 | integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== 388 | 389 | assign-symbols@^1.0.0: 390 | version "1.0.0" 391 | resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" 392 | integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== 393 | 394 | async-each@^1.0.1: 395 | version "1.0.3" 396 | resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz" 397 | integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 398 | 399 | async@0.2.9: 400 | version "0.2.9" 401 | resolved "https://registry.npmjs.org/async/-/async-0.2.9.tgz" 402 | integrity sha512-OAtM6mexGteNKdU29wcUfRW+VuBr94A3hx9h9yzBnPaQAbKoW1ORd68XM4CCAOpdL5wlNFgO29hsY1TKv2vAKw== 403 | 404 | async@0.2.x, async@~0.2.9: 405 | version "0.2.10" 406 | resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz" 407 | integrity sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ== 408 | 409 | async@>=0.2.9, async@^3.2.3: 410 | version "3.2.4" 411 | resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" 412 | integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== 413 | 414 | async@^1.5.2: 415 | version "1.5.2" 416 | resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" 417 | integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== 418 | 419 | atob-lite@^2.0.0: 420 | version "2.0.0" 421 | resolved "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz" 422 | integrity sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw== 423 | 424 | atob@^2.1.2: 425 | version "2.1.2" 426 | resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" 427 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 428 | 429 | available-typed-arrays@^1.0.5: 430 | version "1.0.5" 431 | resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" 432 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== 433 | 434 | balanced-match@^1.0.0: 435 | version "1.0.2" 436 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 437 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 438 | 439 | base64-js@^1.2.0, base64-js@^1.3.1: 440 | version "1.5.1" 441 | resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 442 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 443 | 444 | base@^0.11.1: 445 | version "0.11.2" 446 | resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" 447 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 448 | dependencies: 449 | cache-base "^1.0.1" 450 | class-utils "^0.3.5" 451 | component-emitter "^1.2.1" 452 | define-property "^1.0.0" 453 | isobject "^3.0.1" 454 | mixin-deep "^1.2.0" 455 | pascalcase "^0.1.1" 456 | 457 | binary-extensions@^1.0.0: 458 | version "1.13.1" 459 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" 460 | integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 461 | 462 | bindings@^1.5.0: 463 | version "1.5.0" 464 | resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" 465 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 466 | dependencies: 467 | file-uri-to-path "1.0.0" 468 | 469 | bl@^1.0.0: 470 | version "1.2.3" 471 | resolved "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz" 472 | integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== 473 | dependencies: 474 | readable-stream "^2.3.5" 475 | safe-buffer "^5.1.1" 476 | 477 | bmp-js@^0.1.0: 478 | version "0.1.0" 479 | resolved "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz" 480 | integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== 481 | 482 | bottleneck@^2.19.5: 483 | version "2.19.5" 484 | resolved "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz" 485 | integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== 486 | 487 | brace-expansion@^1.1.7: 488 | version "1.1.11" 489 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 490 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 491 | dependencies: 492 | balanced-match "^1.0.0" 493 | concat-map "0.0.1" 494 | 495 | braces@^2.3.1, braces@^2.3.2: 496 | version "2.3.2" 497 | resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" 498 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 499 | dependencies: 500 | arr-flatten "^1.1.0" 501 | array-unique "^0.3.2" 502 | extend-shallow "^2.0.1" 503 | fill-range "^4.0.0" 504 | isobject "^3.0.1" 505 | repeat-element "^1.1.2" 506 | snapdragon "^0.8.1" 507 | snapdragon-node "^2.0.1" 508 | split-string "^3.0.2" 509 | to-regex "^3.0.1" 510 | 511 | braces@^3.0.2: 512 | version "3.0.2" 513 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 514 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 515 | dependencies: 516 | fill-range "^7.0.1" 517 | 518 | broadway@~0.3.2: 519 | version "0.3.6" 520 | resolved "https://registry.npmjs.org/broadway/-/broadway-0.3.6.tgz" 521 | integrity sha512-zivf7KWx8ftTEsXaKfmve6wdSfbDJ6NLXwhwWN4Q1z5+/nsHWALP952KV9jJbJGwjZHEMZABHyuKqEAh3wb2kw== 522 | dependencies: 523 | cliff "0.1.9" 524 | eventemitter2 "0.4.14" 525 | nconf "0.6.9" 526 | utile "0.2.1" 527 | winston "0.8.0" 528 | 529 | buffer-alloc-unsafe@^1.1.0: 530 | version "1.1.0" 531 | resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" 532 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 533 | 534 | buffer-alloc@^1.2.0: 535 | version "1.2.0" 536 | resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" 537 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 538 | dependencies: 539 | buffer-alloc-unsafe "^1.1.0" 540 | buffer-fill "^1.0.0" 541 | 542 | buffer-crc32@~0.2.3: 543 | version "0.2.13" 544 | resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" 545 | integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== 546 | 547 | buffer-fill@^1.0.0: 548 | version "1.0.0" 549 | resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" 550 | integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== 551 | 552 | buffer@^5.2.1: 553 | version "5.7.1" 554 | resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" 555 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 556 | dependencies: 557 | base64-js "^1.3.1" 558 | ieee754 "^1.1.13" 559 | 560 | bufferutil@^4.0.6: 561 | version "4.0.6" 562 | resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz" 563 | integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== 564 | dependencies: 565 | node-gyp-build "^4.3.0" 566 | 567 | busboy@^1.6.0: 568 | version "1.6.0" 569 | resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" 570 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 571 | dependencies: 572 | streamsearch "^1.1.0" 573 | 574 | cache-base@^1.0.1: 575 | version "1.0.1" 576 | resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" 577 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 578 | dependencies: 579 | collection-visit "^1.0.0" 580 | component-emitter "^1.2.1" 581 | get-value "^2.0.6" 582 | has-value "^1.0.0" 583 | isobject "^3.0.1" 584 | set-value "^2.0.0" 585 | to-object-path "^0.3.0" 586 | union-value "^1.0.0" 587 | unset-value "^1.0.0" 588 | 589 | call-bind@^1.0.0, call-bind@^1.0.2: 590 | version "1.0.2" 591 | resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" 592 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 593 | dependencies: 594 | function-bind "^1.1.1" 595 | get-intrinsic "^1.0.2" 596 | 597 | caller@^1.1.0: 598 | version "1.1.0" 599 | resolved "https://registry.npmjs.org/caller/-/caller-1.1.0.tgz" 600 | integrity sha512-n+21IZC3j06YpCWaxmUy5AnVqhmCIM2bQtqQyy00HJlmStRt6kwDX5F9Z97pqwAB+G/tgSz6q/kUBbNyQzIubw== 601 | 602 | charenc@0.0.2: 603 | version "0.0.2" 604 | resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" 605 | integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== 606 | 607 | chokidar@^2.1.8: 608 | version "2.1.8" 609 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" 610 | integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== 611 | dependencies: 612 | anymatch "^2.0.0" 613 | async-each "^1.0.1" 614 | braces "^2.3.2" 615 | glob-parent "^3.1.0" 616 | inherits "^2.0.3" 617 | is-binary-path "^1.0.0" 618 | is-glob "^4.0.0" 619 | normalize-path "^3.0.0" 620 | path-is-absolute "^1.0.0" 621 | readdirp "^2.2.1" 622 | upath "^1.1.1" 623 | optionalDependencies: 624 | fsevents "^1.2.7" 625 | 626 | clamp@^1.0.1: 627 | version "1.0.1" 628 | resolved "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz" 629 | integrity sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA== 630 | 631 | class-utils@^0.3.5: 632 | version "0.3.6" 633 | resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" 634 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 635 | dependencies: 636 | arr-union "^3.1.0" 637 | define-property "^0.2.5" 638 | isobject "^3.0.0" 639 | static-extend "^0.1.1" 640 | 641 | cliff@0.1.9: 642 | version "0.1.9" 643 | resolved "https://registry.npmjs.org/cliff/-/cliff-0.1.9.tgz" 644 | integrity sha512-2EECQDk23AtYy9WTUDS0UwdlyGJe62IatdR9dOfG/T3+VIoC6/SA5AnYJWGTjXjweTYL360HEGu4DchCeee4Ng== 645 | dependencies: 646 | colors "0.x.x" 647 | eyes "0.1.x" 648 | winston "0.8.x" 649 | 650 | cliff@^0.1.10: 651 | version "0.1.10" 652 | resolved "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz" 653 | integrity sha512-roZWcC2Cxo/kKjRXw7YUpVNtxJccbvcl7VzTjUYgLQk6Ot0R8bm2netbhSZYWWNrKlOO/7HD6GXHl8dtzE6SiQ== 654 | dependencies: 655 | colors "~1.0.3" 656 | eyes "~0.1.8" 657 | winston "0.8.x" 658 | 659 | clone@^2.1.2: 660 | version "2.1.2" 661 | resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" 662 | integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== 663 | 664 | collection-visit@^1.0.0: 665 | version "1.0.0" 666 | resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" 667 | integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== 668 | dependencies: 669 | map-visit "^1.0.0" 670 | object-visit "^1.0.0" 671 | 672 | color-convert@^1.9.3: 673 | version "1.9.3" 674 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 675 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 676 | dependencies: 677 | color-name "1.1.3" 678 | 679 | color-id@^1.1.0: 680 | version "1.1.0" 681 | resolved "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz" 682 | integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== 683 | dependencies: 684 | clamp "^1.0.1" 685 | 686 | color-name@1.1.3: 687 | version "1.1.3" 688 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 689 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 690 | 691 | color-name@^1.0.0: 692 | version "1.1.4" 693 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 694 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 695 | 696 | color-string@^1.6.0: 697 | version "1.9.1" 698 | resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" 699 | integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== 700 | dependencies: 701 | color-name "^1.0.0" 702 | simple-swizzle "^0.2.2" 703 | 704 | color@^3.1.3: 705 | version "3.2.1" 706 | resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" 707 | integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== 708 | dependencies: 709 | color-convert "^1.9.3" 710 | color-string "^1.6.0" 711 | 712 | colors@0.6.2, colors@0.6.x, colors@0.x.x: 713 | version "0.6.2" 714 | resolved "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" 715 | integrity sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw== 716 | 717 | colors@1.4.0: 718 | version "1.4.0" 719 | resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" 720 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 721 | 722 | colors@~1.0.3: 723 | version "1.0.3" 724 | resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" 725 | integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== 726 | 727 | colorspace@1.1.x: 728 | version "1.1.4" 729 | resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" 730 | integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== 731 | dependencies: 732 | color "^3.1.3" 733 | text-hex "1.0.x" 734 | 735 | commander@^2.8.1: 736 | version "2.20.3" 737 | resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" 738 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 739 | 740 | component-emitter@^1.2.1: 741 | version "1.3.0" 742 | resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" 743 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 744 | 745 | compute-dims@^1.1.0: 746 | version "1.1.0" 747 | resolved "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz" 748 | integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== 749 | dependencies: 750 | utils-copy "^1.0.0" 751 | validate.io-array "^1.0.6" 752 | validate.io-matrix-like "^1.0.2" 753 | validate.io-ndarray-like "^1.0.0" 754 | validate.io-positive-integer "^1.0.0" 755 | 756 | concat-map@0.0.1: 757 | version "0.0.1" 758 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 759 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 760 | 761 | configstore@4.0.0: 762 | version "4.0.0" 763 | resolved "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz" 764 | integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== 765 | dependencies: 766 | dot-prop "^4.1.0" 767 | graceful-fs "^4.1.2" 768 | make-dir "^1.0.0" 769 | unique-string "^1.0.0" 770 | write-file-atomic "^2.0.0" 771 | xdg-basedir "^3.0.0" 772 | 773 | const-max-uint32@^1.0.2: 774 | version "1.0.2" 775 | resolved "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz" 776 | integrity sha512-T8/9bffg5RThuejasJWrwqxs3Q0fsJvyl7/33IB6svroD8JC93E7X60AuuOnDE8RlP6Jlb5FxmlrVDpl9KiU2Q== 777 | 778 | const-pinf-float64@^1.0.0: 779 | version "1.0.0" 780 | resolved "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz" 781 | integrity sha512-wfs+V4HdSN7C3CWJWR7hVa24yTPn3mDJthwhRIObZBh6UjTjkUMUrCP3UrNGozB/HjTpcScnGXtQUNa+yjsIJQ== 782 | 783 | copy-descriptor@^0.1.0: 784 | version "0.1.1" 785 | resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" 786 | integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== 787 | 788 | core-util-is@~1.0.0: 789 | version "1.0.3" 790 | resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" 791 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 792 | 793 | create-require@^1.1.0: 794 | version "1.1.1" 795 | resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" 796 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 797 | 798 | cross-env@^7.0.3: 799 | version "7.0.3" 800 | resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" 801 | integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== 802 | dependencies: 803 | cross-spawn "^7.0.1" 804 | 805 | cross-spawn@^7.0.1: 806 | version "7.0.3" 807 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 808 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 809 | dependencies: 810 | path-key "^3.1.0" 811 | shebang-command "^2.0.0" 812 | which "^2.0.1" 813 | 814 | crypt@0.0.2: 815 | version "0.0.2" 816 | resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" 817 | integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== 818 | 819 | crypto-random-string@^1.0.0: 820 | version "1.0.0" 821 | resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" 822 | integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== 823 | 824 | cycle@1.0.x: 825 | version "1.0.3" 826 | resolved "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" 827 | integrity sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA== 828 | 829 | debug@^2.2.0, debug@^2.3.3: 830 | version "2.6.9" 831 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 832 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 833 | dependencies: 834 | ms "2.0.0" 835 | 836 | decode-uri-component@^0.2.0: 837 | version "0.2.0" 838 | resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" 839 | integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== 840 | 841 | decompress-bzip2@^4.0.0: 842 | version "4.0.0" 843 | resolved "https://registry.npmjs.org/decompress-bzip2/-/decompress-bzip2-4.0.0.tgz" 844 | integrity sha512-RwEcbZWaM7F5EiYfsAXUmZ/KLEVAPjYXfGbb5bztXZQ3d5PMpXYxa/1j04QL/gjotRdmzpHh++/cxz+rNZ4AZg== 845 | dependencies: 846 | file-type "^4.3.0" 847 | seek-bzip "^1.0.5" 848 | 849 | decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: 850 | version "4.1.1" 851 | resolved "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz" 852 | integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== 853 | dependencies: 854 | file-type "^5.2.0" 855 | is-stream "^1.1.0" 856 | tar-stream "^1.5.2" 857 | 858 | decompress-tarbz2@^4.0.0, decompress-tarbz2@^4.1.1: 859 | version "4.1.1" 860 | resolved "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz" 861 | integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== 862 | dependencies: 863 | decompress-tar "^4.1.0" 864 | file-type "^6.1.0" 865 | is-stream "^1.1.0" 866 | seek-bzip "^1.0.5" 867 | unbzip2-stream "^1.0.9" 868 | 869 | decompress-targz@^4.0.0, decompress-targz@^4.1.1: 870 | version "4.1.1" 871 | resolved "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz" 872 | integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== 873 | dependencies: 874 | decompress-tar "^4.1.1" 875 | file-type "^5.2.0" 876 | is-stream "^1.1.0" 877 | 878 | decompress-unzip@^4.0.1: 879 | version "4.0.1" 880 | resolved "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz" 881 | integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw== 882 | dependencies: 883 | file-type "^3.8.0" 884 | get-stream "^2.2.0" 885 | pify "^2.3.0" 886 | yauzl "^2.4.2" 887 | 888 | decompress@^4.2.1: 889 | version "4.2.1" 890 | resolved "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz" 891 | integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== 892 | dependencies: 893 | decompress-tar "^4.0.0" 894 | decompress-tarbz2 "^4.0.0" 895 | decompress-targz "^4.0.0" 896 | decompress-unzip "^4.0.1" 897 | graceful-fs "^4.1.10" 898 | make-dir "^1.0.0" 899 | pify "^2.3.0" 900 | strip-dirs "^2.0.0" 901 | 902 | deep-equal@*: 903 | version "2.0.5" 904 | resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz" 905 | integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== 906 | dependencies: 907 | call-bind "^1.0.0" 908 | es-get-iterator "^1.1.1" 909 | get-intrinsic "^1.0.1" 910 | is-arguments "^1.0.4" 911 | is-date-object "^1.0.2" 912 | is-regex "^1.1.1" 913 | isarray "^2.0.5" 914 | object-is "^1.1.4" 915 | object-keys "^1.1.1" 916 | object.assign "^4.1.2" 917 | regexp.prototype.flags "^1.3.0" 918 | side-channel "^1.0.3" 919 | which-boxed-primitive "^1.0.1" 920 | which-collection "^1.0.1" 921 | which-typed-array "^1.1.2" 922 | 923 | define-properties@^1.1.3, define-properties@^1.1.4: 924 | version "1.1.4" 925 | resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" 926 | integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== 927 | dependencies: 928 | has-property-descriptors "^1.0.0" 929 | object-keys "^1.1.1" 930 | 931 | define-property@^0.2.5: 932 | version "0.2.5" 933 | resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" 934 | integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== 935 | dependencies: 936 | is-descriptor "^0.1.0" 937 | 938 | define-property@^1.0.0: 939 | version "1.0.0" 940 | resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" 941 | integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== 942 | dependencies: 943 | is-descriptor "^1.0.0" 944 | 945 | define-property@^2.0.2: 946 | version "2.0.2" 947 | resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" 948 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 949 | dependencies: 950 | is-descriptor "^1.0.2" 951 | isobject "^3.0.1" 952 | 953 | diff@^4.0.1: 954 | version "4.0.2" 955 | resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" 956 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 957 | 958 | director@1.2.7: 959 | version "1.2.7" 960 | resolved "https://registry.npmjs.org/director/-/director-1.2.7.tgz" 961 | integrity sha512-Cuia7IBvmSanM+7ZmKYtP9hq+Du7n7mv2cpCt8GiEIkUDni0ecSlVCFJUL6HWwGzqLX03uA49xVOZOjwnabWmQ== 962 | 963 | discord-api-types@^0.37.37: 964 | version "0.37.38" 965 | resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.38.tgz" 966 | integrity sha512-p9dibYycLXY1FUM9bIuohYeHHwa/634394QE90n6Tlb6ID5HtCtXBPYY68oaOlFnlFLBJAOYATMwX5oiV+VqiA== 967 | 968 | discord.js@^14.9.0: 969 | version "14.9.0" 970 | resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.9.0.tgz" 971 | integrity sha512-ygGms5xP4hG+QrrY9k7d/OYCzMltSMtdl/2Snzq/nLCiZo+Sna91Ulv9l0+B5Jd/Czcq37B7wJAnmja7GOa+bg== 972 | dependencies: 973 | "@discordjs/builders" "^1.6.0" 974 | "@discordjs/collection" "^1.5.0" 975 | "@discordjs/formatters" "^0.3.0" 976 | "@discordjs/rest" "^1.7.0" 977 | "@discordjs/util" "^0.2.0" 978 | "@sapphire/snowflake" "^3.4.0" 979 | "@types/ws" "^8.5.4" 980 | discord-api-types "^0.37.37" 981 | fast-deep-equal "^3.1.3" 982 | lodash.snakecase "^4.1.1" 983 | tslib "^2.5.0" 984 | undici "^5.21.0" 985 | ws "^8.13.0" 986 | 987 | dot-prop@^4.1.0: 988 | version "4.2.1" 989 | resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz" 990 | integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== 991 | dependencies: 992 | is-obj "^1.0.0" 993 | 994 | dotenv@^16.0.1: 995 | version "16.0.1" 996 | resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz" 997 | integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== 998 | 999 | dtype@^2.0.0: 1000 | version "2.0.0" 1001 | resolved "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz" 1002 | integrity sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg== 1003 | 1004 | duplexer@~0.1.1: 1005 | version "0.1.2" 1006 | resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" 1007 | integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== 1008 | 1009 | enabled@2.0.x: 1010 | version "2.0.0" 1011 | resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" 1012 | integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== 1013 | 1014 | end-of-stream@^1.0.0: 1015 | version "1.4.4" 1016 | resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" 1017 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 1018 | dependencies: 1019 | once "^1.4.0" 1020 | 1021 | erlpack@^0.1.4: 1022 | version "0.1.4" 1023 | resolved "https://registry.npmjs.org/erlpack/-/erlpack-0.1.4.tgz" 1024 | integrity sha512-CJYbkEvsB5FqCCu2tLxF1eYKi28PvemC12oqzJ9oO6mDFrFO9G9G7nNJUHhiAyyL9zfXTOJx/tOcrQk+ncD65w== 1025 | dependencies: 1026 | bindings "^1.5.0" 1027 | nan "^2.15.0" 1028 | 1029 | es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: 1030 | version "1.20.1" 1031 | resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz" 1032 | integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== 1033 | dependencies: 1034 | call-bind "^1.0.2" 1035 | es-to-primitive "^1.2.1" 1036 | function-bind "^1.1.1" 1037 | function.prototype.name "^1.1.5" 1038 | get-intrinsic "^1.1.1" 1039 | get-symbol-description "^1.0.0" 1040 | has "^1.0.3" 1041 | has-property-descriptors "^1.0.0" 1042 | has-symbols "^1.0.3" 1043 | internal-slot "^1.0.3" 1044 | is-callable "^1.2.4" 1045 | is-negative-zero "^2.0.2" 1046 | is-regex "^1.1.4" 1047 | is-shared-array-buffer "^1.0.2" 1048 | is-string "^1.0.7" 1049 | is-weakref "^1.0.2" 1050 | object-inspect "^1.12.0" 1051 | object-keys "^1.1.1" 1052 | object.assign "^4.1.2" 1053 | regexp.prototype.flags "^1.4.3" 1054 | string.prototype.trimend "^1.0.5" 1055 | string.prototype.trimstart "^1.0.5" 1056 | unbox-primitive "^1.0.2" 1057 | 1058 | es-get-iterator@^1.1.1: 1059 | version "1.1.2" 1060 | resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz" 1061 | integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== 1062 | dependencies: 1063 | call-bind "^1.0.2" 1064 | get-intrinsic "^1.1.0" 1065 | has-symbols "^1.0.1" 1066 | is-arguments "^1.1.0" 1067 | is-map "^2.0.2" 1068 | is-set "^2.0.2" 1069 | is-string "^1.0.5" 1070 | isarray "^2.0.5" 1071 | 1072 | es-to-primitive@^1.2.1: 1073 | version "1.2.1" 1074 | resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" 1075 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 1076 | dependencies: 1077 | is-callable "^1.1.4" 1078 | is-date-object "^1.0.1" 1079 | is-symbol "^1.0.2" 1080 | 1081 | event-stream@=3.3.4: 1082 | version "3.3.4" 1083 | resolved "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz" 1084 | integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== 1085 | dependencies: 1086 | duplexer "~0.1.1" 1087 | from "~0" 1088 | map-stream "~0.1.0" 1089 | pause-stream "0.0.11" 1090 | split "0.3" 1091 | stream-combiner "~0.0.4" 1092 | through "~2.3.1" 1093 | 1094 | eventemitter-asyncresource@^1.0.0: 1095 | version "1.0.0" 1096 | resolved "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz" 1097 | integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== 1098 | 1099 | eventemitter2@0.4.14, eventemitter2@~0.4.14: 1100 | version "0.4.14" 1101 | resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" 1102 | integrity sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ== 1103 | 1104 | eventemitter2@6.4.4: 1105 | version "6.4.4" 1106 | resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz" 1107 | integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== 1108 | 1109 | eventemitter2@^6.4.3: 1110 | version "6.4.7" 1111 | resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz" 1112 | integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== 1113 | 1114 | expand-brackets@^2.1.4: 1115 | version "2.1.4" 1116 | resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" 1117 | integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== 1118 | dependencies: 1119 | debug "^2.3.3" 1120 | define-property "^0.2.5" 1121 | extend-shallow "^2.0.1" 1122 | posix-character-classes "^0.1.0" 1123 | regex-not "^1.0.0" 1124 | snapdragon "^0.8.1" 1125 | to-regex "^3.0.1" 1126 | 1127 | extend-shallow@^2.0.1: 1128 | version "2.0.1" 1129 | resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" 1130 | integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== 1131 | dependencies: 1132 | is-extendable "^0.1.0" 1133 | 1134 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 1135 | version "3.0.2" 1136 | resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" 1137 | integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== 1138 | dependencies: 1139 | assign-symbols "^1.0.0" 1140 | is-extendable "^1.0.1" 1141 | 1142 | extglob@^2.0.4: 1143 | version "2.0.4" 1144 | resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" 1145 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 1146 | dependencies: 1147 | array-unique "^0.3.2" 1148 | define-property "^1.0.0" 1149 | expand-brackets "^2.1.4" 1150 | extend-shallow "^2.0.1" 1151 | fragment-cache "^0.2.1" 1152 | regex-not "^1.0.0" 1153 | snapdragon "^0.8.1" 1154 | to-regex "^3.0.1" 1155 | 1156 | eyes@0.1.x, eyes@~0.1.8: 1157 | version "0.1.8" 1158 | resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" 1159 | integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== 1160 | 1161 | fast-deep-equal@^3.1.3: 1162 | version "3.1.3" 1163 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 1164 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1165 | 1166 | fast-glob@^3.2.11: 1167 | version "3.2.11" 1168 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" 1169 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 1170 | dependencies: 1171 | "@nodelib/fs.stat" "^2.0.2" 1172 | "@nodelib/fs.walk" "^1.2.3" 1173 | glob-parent "^5.1.2" 1174 | merge2 "^1.3.0" 1175 | micromatch "^4.0.4" 1176 | 1177 | fastq@^1.6.0: 1178 | version "1.13.0" 1179 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" 1180 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 1181 | dependencies: 1182 | reusify "^1.0.4" 1183 | 1184 | fd-slicer@~1.1.0: 1185 | version "1.1.0" 1186 | resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" 1187 | integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== 1188 | dependencies: 1189 | pend "~1.2.0" 1190 | 1191 | fecha@^4.2.0: 1192 | version "4.2.3" 1193 | resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" 1194 | integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== 1195 | 1196 | file-type@^10.9.0: 1197 | version "10.11.0" 1198 | resolved "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz" 1199 | integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== 1200 | 1201 | file-type@^18.2.1: 1202 | version "18.2.1" 1203 | resolved "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz" 1204 | integrity sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg== 1205 | dependencies: 1206 | readable-web-to-node-stream "^3.0.2" 1207 | strtok3 "^7.0.0" 1208 | token-types "^5.0.1" 1209 | 1210 | file-type@^3.8.0: 1211 | version "3.9.0" 1212 | resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" 1213 | integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== 1214 | 1215 | file-type@^4.3.0: 1216 | version "4.4.0" 1217 | resolved "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz" 1218 | integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ== 1219 | 1220 | file-type@^5.2.0: 1221 | version "5.2.0" 1222 | resolved "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz" 1223 | integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ== 1224 | 1225 | file-type@^6.1.0: 1226 | version "6.2.0" 1227 | resolved "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz" 1228 | integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== 1229 | 1230 | file-uri-to-path@1.0.0: 1231 | version "1.0.0" 1232 | resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" 1233 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 1234 | 1235 | fill-range@^4.0.0: 1236 | version "4.0.0" 1237 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" 1238 | integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== 1239 | dependencies: 1240 | extend-shallow "^2.0.1" 1241 | is-number "^3.0.0" 1242 | repeat-string "^1.6.1" 1243 | to-regex-range "^2.1.0" 1244 | 1245 | fill-range@^7.0.1: 1246 | version "7.0.1" 1247 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 1248 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1249 | dependencies: 1250 | to-regex-range "^5.0.1" 1251 | 1252 | flatiron@~0.4.3: 1253 | version "0.4.3" 1254 | resolved "https://registry.npmjs.org/flatiron/-/flatiron-0.4.3.tgz" 1255 | integrity sha512-+X3/0hl9in0FJPsPB5/xTpkxxMzDSoA4cyon46HtXhrfEbpqBvKxpR+HJGqMjKv4jcBmoLjEtTVIAADJjLjv8A== 1256 | dependencies: 1257 | broadway "~0.3.2" 1258 | director "1.2.7" 1259 | optimist "0.6.0" 1260 | prompt "0.2.14" 1261 | 1262 | flatten-vertex-data@^1.0.2: 1263 | version "1.0.2" 1264 | resolved "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz" 1265 | integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== 1266 | dependencies: 1267 | dtype "^2.0.0" 1268 | 1269 | flip-pixels@^1.0.2: 1270 | version "1.0.2" 1271 | resolved "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz" 1272 | integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== 1273 | 1274 | "fluent-ffmpeg@https://github.com/rossimo/node-fluent-ffmpeg": 1275 | version "2.1.2" 1276 | resolved "https://github.com/rossimo/node-fluent-ffmpeg#2432ad95b198ec2904a198fe82da0a6bf3958c1a" 1277 | dependencies: 1278 | async ">=0.2.9" 1279 | which "^1.1.1" 1280 | 1281 | fn.name@1.x.x: 1282 | version "1.1.0" 1283 | resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" 1284 | integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== 1285 | 1286 | for-each@^0.3.3: 1287 | version "0.3.3" 1288 | resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" 1289 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 1290 | dependencies: 1291 | is-callable "^1.1.3" 1292 | 1293 | for-in@^1.0.2: 1294 | version "1.0.2" 1295 | resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" 1296 | integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== 1297 | 1298 | forever-monitor@^3.0.3: 1299 | version "3.0.3" 1300 | resolved "https://registry.npmjs.org/forever-monitor/-/forever-monitor-3.0.3.tgz" 1301 | integrity sha512-7YGDo0UlbMy++6G3lzncWISDaT5CVp+yPVAkZ7FDFF0ec+0HKgBOWOhPGKpMF0hjcm3Ps/HbtrETrQLYREZ7YQ== 1302 | dependencies: 1303 | async "^1.5.2" 1304 | chokidar "^2.1.8" 1305 | eventemitter2 "^6.4.3" 1306 | minimatch "^3.0.4" 1307 | ps-tree "^1.2.0" 1308 | 1309 | forever@^4.0.3: 1310 | version "4.0.3" 1311 | resolved "https://registry.npmjs.org/forever/-/forever-4.0.3.tgz" 1312 | integrity sha512-N8aVtvB3bdh3lXPE9Rb+ErISSnJsAkv0GgZ0h6qtN8UXFgcSqJNMyBst9r3SBNk6+n4iBVaZso16mr1SUVvG3Q== 1313 | dependencies: 1314 | async "^1.5.2" 1315 | cliff "^0.1.10" 1316 | clone "^2.1.2" 1317 | colors "0.6.2" 1318 | configstore "4.0.0" 1319 | eventemitter2 "6.4.4" 1320 | flatiron "~0.4.3" 1321 | forever-monitor "^3.0.3" 1322 | mkdirp "^0.5.5" 1323 | nssocket "^0.6.0" 1324 | object-assign "^4.1.1" 1325 | prettyjson "^1.2.2" 1326 | shush "^1.0.0" 1327 | winston "^3.4.0" 1328 | 1329 | fragment-cache@^0.2.1: 1330 | version "0.2.1" 1331 | resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" 1332 | integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== 1333 | dependencies: 1334 | map-cache "^0.2.2" 1335 | 1336 | from@~0: 1337 | version "0.1.7" 1338 | resolved "https://registry.npmjs.org/from/-/from-0.1.7.tgz" 1339 | integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== 1340 | 1341 | fs-constants@^1.0.0: 1342 | version "1.0.0" 1343 | resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" 1344 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 1345 | 1346 | fs.realpath@^1.0.0: 1347 | version "1.0.0" 1348 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 1349 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1350 | 1351 | fsevents@^1.2.7: 1352 | version "1.2.13" 1353 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" 1354 | integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== 1355 | dependencies: 1356 | bindings "^1.5.0" 1357 | nan "^2.12.1" 1358 | 1359 | function-bind@^1.1.1: 1360 | version "1.1.1" 1361 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 1362 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1363 | 1364 | function.prototype.name@^1.1.5: 1365 | version "1.1.5" 1366 | resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" 1367 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 1368 | dependencies: 1369 | call-bind "^1.0.2" 1370 | define-properties "^1.1.3" 1371 | es-abstract "^1.19.0" 1372 | functions-have-names "^1.2.2" 1373 | 1374 | functions-have-names@^1.2.2: 1375 | version "1.2.3" 1376 | resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" 1377 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 1378 | 1379 | get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: 1380 | version "1.1.2" 1381 | resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" 1382 | integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== 1383 | dependencies: 1384 | function-bind "^1.1.1" 1385 | has "^1.0.3" 1386 | has-symbols "^1.0.3" 1387 | 1388 | get-stream@^2.2.0: 1389 | version "2.3.1" 1390 | resolved "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz" 1391 | integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA== 1392 | dependencies: 1393 | object-assign "^4.0.1" 1394 | pinkie-promise "^2.0.0" 1395 | 1396 | get-symbol-description@^1.0.0: 1397 | version "1.0.0" 1398 | resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" 1399 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 1400 | dependencies: 1401 | call-bind "^1.0.2" 1402 | get-intrinsic "^1.1.1" 1403 | 1404 | get-value@^2.0.3, get-value@^2.0.6: 1405 | version "2.0.6" 1406 | resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" 1407 | integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== 1408 | 1409 | glob-parent@^3.1.0: 1410 | version "3.1.0" 1411 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" 1412 | integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== 1413 | dependencies: 1414 | is-glob "^3.1.0" 1415 | path-dirname "^1.0.0" 1416 | 1417 | glob-parent@^5.1.2: 1418 | version "5.1.2" 1419 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 1420 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1421 | dependencies: 1422 | is-glob "^4.0.1" 1423 | 1424 | glob@^7.0.0, glob@^7.1.3: 1425 | version "7.2.3" 1426 | resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" 1427 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1428 | dependencies: 1429 | fs.realpath "^1.0.0" 1430 | inflight "^1.0.4" 1431 | inherits "2" 1432 | minimatch "^3.1.1" 1433 | once "^1.3.0" 1434 | path-is-absolute "^1.0.0" 1435 | 1436 | graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2: 1437 | version "4.2.10" 1438 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" 1439 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 1440 | 1441 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1442 | version "1.0.2" 1443 | resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" 1444 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1445 | 1446 | has-property-descriptors@^1.0.0: 1447 | version "1.0.0" 1448 | resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" 1449 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1450 | dependencies: 1451 | get-intrinsic "^1.1.1" 1452 | 1453 | has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: 1454 | version "1.0.3" 1455 | resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" 1456 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1457 | 1458 | has-tostringtag@^1.0.0: 1459 | version "1.0.0" 1460 | resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" 1461 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1462 | dependencies: 1463 | has-symbols "^1.0.2" 1464 | 1465 | has-value@^0.3.1: 1466 | version "0.3.1" 1467 | resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" 1468 | integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== 1469 | dependencies: 1470 | get-value "^2.0.3" 1471 | has-values "^0.1.4" 1472 | isobject "^2.0.0" 1473 | 1474 | has-value@^1.0.0: 1475 | version "1.0.0" 1476 | resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" 1477 | integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== 1478 | dependencies: 1479 | get-value "^2.0.6" 1480 | has-values "^1.0.0" 1481 | isobject "^3.0.0" 1482 | 1483 | has-values@^0.1.4: 1484 | version "0.1.4" 1485 | resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" 1486 | integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== 1487 | 1488 | has-values@^1.0.0: 1489 | version "1.0.0" 1490 | resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" 1491 | integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== 1492 | dependencies: 1493 | is-number "^3.0.0" 1494 | kind-of "^4.0.0" 1495 | 1496 | has@^1.0.3: 1497 | version "1.0.3" 1498 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 1499 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1500 | dependencies: 1501 | function-bind "^1.1.1" 1502 | 1503 | hash-wasm@^4.9.0: 1504 | version "4.9.0" 1505 | resolved "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz" 1506 | integrity sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w== 1507 | 1508 | hdr-histogram-js@^2.0.1: 1509 | version "2.0.3" 1510 | resolved "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz" 1511 | integrity sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g== 1512 | dependencies: 1513 | "@assemblyscript/loader" "^0.10.1" 1514 | base64-js "^1.2.0" 1515 | pako "^1.0.3" 1516 | 1517 | hdr-histogram-percentiles-obj@^3.0.0: 1518 | version "3.0.0" 1519 | resolved "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz" 1520 | integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== 1521 | 1522 | i@0.3.x: 1523 | version "0.3.7" 1524 | resolved "https://registry.npmjs.org/i/-/i-0.3.7.tgz" 1525 | integrity sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q== 1526 | 1527 | ieee754@^1.1.13, ieee754@^1.2.1: 1528 | version "1.2.1" 1529 | resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" 1530 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1531 | 1532 | image-encode@^1.3.1: 1533 | version "1.3.1" 1534 | resolved "https://registry.npmjs.org/image-encode/-/image-encode-1.3.1.tgz" 1535 | integrity sha512-XlDSaqGFrW0Rn08fxJM725+h9Hfx/D9u1RVMP8IrcSRN5Ib74UgVf7yuzoS8YAxKc6HqQ8bhDSvy+rIzCUoAYg== 1536 | dependencies: 1537 | bmp-js "^0.1.0" 1538 | image-palette "^2.0.1" 1539 | image-type "^3.0.0" 1540 | is-plain-obj "^1.1.0" 1541 | jpeg-js "^0.4.1" 1542 | next-pow-2 "^1.0.0" 1543 | object-assign "^4.1.1" 1544 | omggif "^1.0.9" 1545 | pngjs "^3.3.3" 1546 | pxls "^2.3.1" 1547 | to-array-buffer "^3.0.0" 1548 | utif "^2.0.1" 1549 | 1550 | image-palette@^2.0.1: 1551 | version "2.1.0" 1552 | resolved "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz" 1553 | integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== 1554 | dependencies: 1555 | color-id "^1.1.0" 1556 | pxls "^2.0.0" 1557 | quantize "^1.0.2" 1558 | 1559 | image-type@^3.0.0: 1560 | version "3.1.0" 1561 | resolved "https://registry.npmjs.org/image-type/-/image-type-3.1.0.tgz" 1562 | integrity sha512-edYRXKQ3WD2yHXFGUbwoJVn5v7j1A6Z505uZUYIfzCwOOhPGLYSc3VOucF9fqbsaUbgb37DdjOU+WV4uo7ZooQ== 1563 | dependencies: 1564 | file-type "^10.9.0" 1565 | 1566 | imurmurhash@^0.1.4: 1567 | version "0.1.4" 1568 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 1569 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1570 | 1571 | inflight@^1.0.4: 1572 | version "1.0.6" 1573 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 1574 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1575 | dependencies: 1576 | once "^1.3.0" 1577 | wrappy "1" 1578 | 1579 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 1580 | version "2.0.4" 1581 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 1582 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1583 | 1584 | ini@1.x.x: 1585 | version "1.3.8" 1586 | resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" 1587 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1588 | 1589 | internal-slot@^1.0.3: 1590 | version "1.0.3" 1591 | resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" 1592 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 1593 | dependencies: 1594 | get-intrinsic "^1.1.0" 1595 | has "^1.0.3" 1596 | side-channel "^1.0.4" 1597 | 1598 | interpret@^1.0.0: 1599 | version "1.4.0" 1600 | resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" 1601 | integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== 1602 | 1603 | is-accessor-descriptor@^0.1.6: 1604 | version "0.1.6" 1605 | resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" 1606 | integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== 1607 | dependencies: 1608 | kind-of "^3.0.2" 1609 | 1610 | is-accessor-descriptor@^1.0.0: 1611 | version "1.0.0" 1612 | resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" 1613 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1614 | dependencies: 1615 | kind-of "^6.0.0" 1616 | 1617 | is-arguments@^1.0.4, is-arguments@^1.1.0: 1618 | version "1.1.1" 1619 | resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" 1620 | integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== 1621 | dependencies: 1622 | call-bind "^1.0.2" 1623 | has-tostringtag "^1.0.0" 1624 | 1625 | is-arrayish@^0.3.1: 1626 | version "0.3.2" 1627 | resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" 1628 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 1629 | 1630 | is-base64@^0.1.0: 1631 | version "0.1.0" 1632 | resolved "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz" 1633 | integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== 1634 | 1635 | is-bigint@^1.0.1: 1636 | version "1.0.4" 1637 | resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" 1638 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1639 | dependencies: 1640 | has-bigints "^1.0.1" 1641 | 1642 | is-binary-path@^1.0.0: 1643 | version "1.0.1" 1644 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" 1645 | integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== 1646 | dependencies: 1647 | binary-extensions "^1.0.0" 1648 | 1649 | is-blob@^2.0.1: 1650 | version "2.1.0" 1651 | resolved "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz" 1652 | integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== 1653 | 1654 | is-boolean-object@^1.1.0: 1655 | version "1.1.2" 1656 | resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" 1657 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1658 | dependencies: 1659 | call-bind "^1.0.2" 1660 | has-tostringtag "^1.0.0" 1661 | 1662 | is-browser@^2.1.0: 1663 | version "2.1.0" 1664 | resolved "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz" 1665 | integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== 1666 | 1667 | is-buffer@^1.1.5, is-buffer@~1.1.6: 1668 | version "1.1.6" 1669 | resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" 1670 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1671 | 1672 | is-buffer@^2.0.3: 1673 | version "2.0.5" 1674 | resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" 1675 | integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== 1676 | 1677 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: 1678 | version "1.2.4" 1679 | resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" 1680 | integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== 1681 | 1682 | is-core-module@^2.9.0: 1683 | version "2.10.0" 1684 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" 1685 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 1686 | dependencies: 1687 | has "^1.0.3" 1688 | 1689 | is-data-descriptor@^0.1.4: 1690 | version "0.1.4" 1691 | resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" 1692 | integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== 1693 | dependencies: 1694 | kind-of "^3.0.2" 1695 | 1696 | is-data-descriptor@^1.0.0: 1697 | version "1.0.0" 1698 | resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" 1699 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1700 | dependencies: 1701 | kind-of "^6.0.0" 1702 | 1703 | is-date-object@^1.0.1, is-date-object@^1.0.2: 1704 | version "1.0.5" 1705 | resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" 1706 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1707 | dependencies: 1708 | has-tostringtag "^1.0.0" 1709 | 1710 | is-descriptor@^0.1.0: 1711 | version "0.1.6" 1712 | resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" 1713 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1714 | dependencies: 1715 | is-accessor-descriptor "^0.1.6" 1716 | is-data-descriptor "^0.1.4" 1717 | kind-of "^5.0.0" 1718 | 1719 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1720 | version "1.0.2" 1721 | resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" 1722 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1723 | dependencies: 1724 | is-accessor-descriptor "^1.0.0" 1725 | is-data-descriptor "^1.0.0" 1726 | kind-of "^6.0.2" 1727 | 1728 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1729 | version "0.1.1" 1730 | resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" 1731 | integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== 1732 | 1733 | is-extendable@^1.0.1: 1734 | version "1.0.1" 1735 | resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" 1736 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1737 | dependencies: 1738 | is-plain-object "^2.0.4" 1739 | 1740 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1741 | version "2.1.1" 1742 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 1743 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1744 | 1745 | is-float-array@^1.0.0: 1746 | version "1.0.0" 1747 | resolved "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz" 1748 | integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== 1749 | 1750 | is-glob@^3.1.0: 1751 | version "3.1.0" 1752 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" 1753 | integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== 1754 | dependencies: 1755 | is-extglob "^2.1.0" 1756 | 1757 | is-glob@^4.0.0, is-glob@^4.0.1: 1758 | version "4.0.3" 1759 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 1760 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1761 | dependencies: 1762 | is-extglob "^2.1.1" 1763 | 1764 | is-map@^2.0.1, is-map@^2.0.2: 1765 | version "2.0.2" 1766 | resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" 1767 | integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== 1768 | 1769 | is-natural-number@^4.0.1: 1770 | version "4.0.1" 1771 | resolved "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz" 1772 | integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== 1773 | 1774 | is-negative-zero@^2.0.2: 1775 | version "2.0.2" 1776 | resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" 1777 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1778 | 1779 | is-number-object@^1.0.4: 1780 | version "1.0.7" 1781 | resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" 1782 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1783 | dependencies: 1784 | has-tostringtag "^1.0.0" 1785 | 1786 | is-number@^3.0.0: 1787 | version "3.0.0" 1788 | resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" 1789 | integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== 1790 | dependencies: 1791 | kind-of "^3.0.2" 1792 | 1793 | is-number@^7.0.0: 1794 | version "7.0.0" 1795 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 1796 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1797 | 1798 | is-obj@^1.0.0: 1799 | version "1.0.1" 1800 | resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" 1801 | integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== 1802 | 1803 | is-plain-obj@^1.1.0: 1804 | version "1.1.0" 1805 | resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" 1806 | integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== 1807 | 1808 | is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1809 | version "2.0.4" 1810 | resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" 1811 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1812 | dependencies: 1813 | isobject "^3.0.1" 1814 | 1815 | is-regex@^1.1.1, is-regex@^1.1.4: 1816 | version "1.1.4" 1817 | resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" 1818 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1819 | dependencies: 1820 | call-bind "^1.0.2" 1821 | has-tostringtag "^1.0.0" 1822 | 1823 | is-set@^2.0.1, is-set@^2.0.2: 1824 | version "2.0.2" 1825 | resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" 1826 | integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== 1827 | 1828 | is-shared-array-buffer@^1.0.2: 1829 | version "1.0.2" 1830 | resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" 1831 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1832 | dependencies: 1833 | call-bind "^1.0.2" 1834 | 1835 | is-stream@^1.1.0: 1836 | version "1.1.0" 1837 | resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" 1838 | integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== 1839 | 1840 | is-stream@^2.0.0: 1841 | version "2.0.1" 1842 | resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" 1843 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1844 | 1845 | is-string@^1.0.5, is-string@^1.0.7: 1846 | version "1.0.7" 1847 | resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" 1848 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1849 | dependencies: 1850 | has-tostringtag "^1.0.0" 1851 | 1852 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1853 | version "1.0.4" 1854 | resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" 1855 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1856 | dependencies: 1857 | has-symbols "^1.0.2" 1858 | 1859 | is-typed-array@^1.1.9: 1860 | version "1.1.9" 1861 | resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz" 1862 | integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== 1863 | dependencies: 1864 | available-typed-arrays "^1.0.5" 1865 | call-bind "^1.0.2" 1866 | es-abstract "^1.20.0" 1867 | for-each "^0.3.3" 1868 | has-tostringtag "^1.0.0" 1869 | 1870 | is-weakmap@^2.0.1: 1871 | version "2.0.1" 1872 | resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" 1873 | integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== 1874 | 1875 | is-weakref@^1.0.2: 1876 | version "1.0.2" 1877 | resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" 1878 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1879 | dependencies: 1880 | call-bind "^1.0.2" 1881 | 1882 | is-weakset@^2.0.1: 1883 | version "2.0.2" 1884 | resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" 1885 | integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== 1886 | dependencies: 1887 | call-bind "^1.0.2" 1888 | get-intrinsic "^1.1.1" 1889 | 1890 | is-windows@^1.0.2: 1891 | version "1.0.2" 1892 | resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" 1893 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1894 | 1895 | isarray@1.0.0, isarray@~1.0.0: 1896 | version "1.0.0" 1897 | resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 1898 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 1899 | 1900 | isarray@^2.0.5: 1901 | version "2.0.5" 1902 | resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" 1903 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 1904 | 1905 | isexe@^2.0.0: 1906 | version "2.0.0" 1907 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 1908 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1909 | 1910 | isobject@^2.0.0: 1911 | version "2.1.0" 1912 | resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" 1913 | integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== 1914 | dependencies: 1915 | isarray "1.0.0" 1916 | 1917 | isobject@^3.0.0, isobject@^3.0.1: 1918 | version "3.0.1" 1919 | resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" 1920 | integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== 1921 | 1922 | isstream@0.1.x: 1923 | version "0.1.2" 1924 | resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 1925 | integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== 1926 | 1927 | jpeg-js@^0.4.1: 1928 | version "0.4.4" 1929 | resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz" 1930 | integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== 1931 | 1932 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1933 | version "3.2.2" 1934 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" 1935 | integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== 1936 | dependencies: 1937 | is-buffer "^1.1.5" 1938 | 1939 | kind-of@^4.0.0: 1940 | version "4.0.0" 1941 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" 1942 | integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== 1943 | dependencies: 1944 | is-buffer "^1.1.5" 1945 | 1946 | kind-of@^5.0.0: 1947 | version "5.1.0" 1948 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" 1949 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1950 | 1951 | kind-of@^6.0.0, kind-of@^6.0.2: 1952 | version "6.0.3" 1953 | resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" 1954 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1955 | 1956 | kuler@^2.0.0: 1957 | version "2.0.0" 1958 | resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" 1959 | integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== 1960 | 1961 | lazy@~1.0.11: 1962 | version "1.0.11" 1963 | resolved "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz" 1964 | integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== 1965 | 1966 | lodash.snakecase@^4.1.1: 1967 | version "4.1.1" 1968 | resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" 1969 | integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== 1970 | 1971 | lodash@^4.17.21: 1972 | version "4.17.21" 1973 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 1974 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1975 | 1976 | logform@^2.3.2, logform@^2.4.0: 1977 | version "2.4.2" 1978 | resolved "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz" 1979 | integrity sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw== 1980 | dependencies: 1981 | "@colors/colors" "1.5.0" 1982 | fecha "^4.2.0" 1983 | ms "^2.1.1" 1984 | safe-stable-stringify "^2.3.1" 1985 | triple-beam "^1.3.0" 1986 | 1987 | lru-cache@*, lru-cache@^7.14.0: 1988 | version "7.14.0" 1989 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz" 1990 | integrity sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ== 1991 | 1992 | make-dir@^1.0.0: 1993 | version "1.3.0" 1994 | resolved "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz" 1995 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 1996 | dependencies: 1997 | pify "^3.0.0" 1998 | 1999 | make-error@^1.1.1: 2000 | version "1.3.6" 2001 | resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" 2002 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 2003 | 2004 | map-cache@^0.2.2: 2005 | version "0.2.2" 2006 | resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" 2007 | integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== 2008 | 2009 | map-stream@~0.1.0: 2010 | version "0.1.0" 2011 | resolved "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz" 2012 | integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== 2013 | 2014 | map-visit@^1.0.0: 2015 | version "1.0.0" 2016 | resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" 2017 | integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== 2018 | dependencies: 2019 | object-visit "^1.0.0" 2020 | 2021 | md5@^2.3.0: 2022 | version "2.3.0" 2023 | resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" 2024 | integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== 2025 | dependencies: 2026 | charenc "0.0.2" 2027 | crypt "0.0.2" 2028 | is-buffer "~1.1.6" 2029 | 2030 | merge2@^1.3.0: 2031 | version "1.4.1" 2032 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 2033 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 2034 | 2035 | micromatch@^3.1.10, micromatch@^3.1.4: 2036 | version "3.1.10" 2037 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" 2038 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 2039 | dependencies: 2040 | arr-diff "^4.0.0" 2041 | array-unique "^0.3.2" 2042 | braces "^2.3.1" 2043 | define-property "^2.0.2" 2044 | extend-shallow "^3.0.2" 2045 | extglob "^2.0.4" 2046 | fragment-cache "^0.2.1" 2047 | kind-of "^6.0.2" 2048 | nanomatch "^1.2.9" 2049 | object.pick "^1.3.0" 2050 | regex-not "^1.0.0" 2051 | snapdragon "^0.8.1" 2052 | to-regex "^3.0.2" 2053 | 2054 | micromatch@^4.0.4: 2055 | version "4.0.5" 2056 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" 2057 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 2058 | dependencies: 2059 | braces "^3.0.2" 2060 | picomatch "^2.3.1" 2061 | 2062 | minimatch@^3.0.4, minimatch@^3.1.1: 2063 | version "3.1.2" 2064 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 2065 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 2066 | dependencies: 2067 | brace-expansion "^1.1.7" 2068 | 2069 | minimist@^1.2.0, minimist@^1.2.6: 2070 | version "1.2.6" 2071 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" 2072 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 2073 | 2074 | minimist@~0.0.1: 2075 | version "0.0.10" 2076 | resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" 2077 | integrity sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw== 2078 | 2079 | mixin-deep@^1.2.0: 2080 | version "1.3.2" 2081 | resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" 2082 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 2083 | dependencies: 2084 | for-in "^1.0.2" 2085 | is-extendable "^1.0.1" 2086 | 2087 | mkdirp@0.x.x, mkdirp@^0.5.5: 2088 | version "0.5.6" 2089 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" 2090 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 2091 | dependencies: 2092 | minimist "^1.2.6" 2093 | 2094 | ms@2.0.0: 2095 | version "2.0.0" 2096 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 2097 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 2098 | 2099 | ms@^2.1.1: 2100 | version "2.1.3" 2101 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 2102 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 2103 | 2104 | mute-stream@~0.0.4: 2105 | version "0.0.8" 2106 | resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" 2107 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 2108 | 2109 | nan@^2.12.1: 2110 | version "2.17.0" 2111 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" 2112 | integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== 2113 | 2114 | nan@^2.14.0, nan@^2.15.0: 2115 | version "2.16.0" 2116 | resolved "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz" 2117 | integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== 2118 | 2119 | nanomatch@^1.2.9: 2120 | version "1.2.13" 2121 | resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" 2122 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 2123 | dependencies: 2124 | arr-diff "^4.0.0" 2125 | array-unique "^0.3.2" 2126 | define-property "^2.0.2" 2127 | extend-shallow "^3.0.2" 2128 | fragment-cache "^0.2.1" 2129 | is-windows "^1.0.2" 2130 | kind-of "^6.0.2" 2131 | object.pick "^1.3.0" 2132 | regex-not "^1.0.0" 2133 | snapdragon "^0.8.1" 2134 | to-regex "^3.0.1" 2135 | 2136 | nconf@0.6.9: 2137 | version "0.6.9" 2138 | resolved "https://registry.npmjs.org/nconf/-/nconf-0.6.9.tgz" 2139 | integrity sha512-MHiYHIc2igQsoI1v0IcVE4MVaV/+yIQtduOwUcQNoLd+pPgoKblWKbgU3itkhC0az5w2VMdQlQuAO+oi4qxtJg== 2140 | dependencies: 2141 | async "0.2.9" 2142 | ini "1.x.x" 2143 | optimist "0.6.0" 2144 | 2145 | ncp@0.4.x: 2146 | version "0.4.2" 2147 | resolved "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz" 2148 | integrity sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA== 2149 | 2150 | next-pow-2@^1.0.0: 2151 | version "1.0.0" 2152 | resolved "https://registry.npmjs.org/next-pow-2/-/next-pow-2-1.0.0.tgz" 2153 | integrity sha512-q+HqJpSkvVqOo75HUY5h1JurDXxHMvjPi5INOfZr3QiSlYUPBzRs6JZx8VPWf7pf18yg6NHUWvwfUILGxJ8ekg== 2154 | 2155 | nice-napi@^1.0.2: 2156 | version "1.0.2" 2157 | resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" 2158 | integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== 2159 | dependencies: 2160 | node-addon-api "^3.0.0" 2161 | node-gyp-build "^4.2.2" 2162 | 2163 | node-addon-api@^3.0.0: 2164 | version "3.2.1" 2165 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" 2166 | integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== 2167 | 2168 | node-gyp-build@^4.2.2: 2169 | version "4.6.0" 2170 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" 2171 | integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== 2172 | 2173 | node-gyp-build@^4.3.0: 2174 | version "4.5.0" 2175 | resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" 2176 | integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== 2177 | 2178 | normalize-path@^2.1.1: 2179 | version "2.1.1" 2180 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" 2181 | integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== 2182 | dependencies: 2183 | remove-trailing-separator "^1.0.1" 2184 | 2185 | normalize-path@^3.0.0: 2186 | version "3.0.0" 2187 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 2188 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 2189 | 2190 | nssocket@^0.6.0: 2191 | version "0.6.0" 2192 | resolved "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz" 2193 | integrity sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w== 2194 | dependencies: 2195 | eventemitter2 "~0.4.14" 2196 | lazy "~1.0.11" 2197 | 2198 | object-assign@^4.0.1, object-assign@^4.1.1: 2199 | version "4.1.1" 2200 | resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 2201 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 2202 | 2203 | object-copy@^0.1.0: 2204 | version "0.1.0" 2205 | resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" 2206 | integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== 2207 | dependencies: 2208 | copy-descriptor "^0.1.0" 2209 | define-property "^0.2.5" 2210 | kind-of "^3.0.3" 2211 | 2212 | object-inspect@^1.12.0, object-inspect@^1.9.0: 2213 | version "1.12.2" 2214 | resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" 2215 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 2216 | 2217 | object-is@^1.1.4: 2218 | version "1.1.5" 2219 | resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" 2220 | integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== 2221 | dependencies: 2222 | call-bind "^1.0.2" 2223 | define-properties "^1.1.3" 2224 | 2225 | object-keys@^1.0.9, object-keys@^1.1.1: 2226 | version "1.1.1" 2227 | resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" 2228 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 2229 | 2230 | object-visit@^1.0.0: 2231 | version "1.0.1" 2232 | resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" 2233 | integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== 2234 | dependencies: 2235 | isobject "^3.0.0" 2236 | 2237 | object.assign@^4.1.2: 2238 | version "4.1.4" 2239 | resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" 2240 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 2241 | dependencies: 2242 | call-bind "^1.0.2" 2243 | define-properties "^1.1.4" 2244 | has-symbols "^1.0.3" 2245 | object-keys "^1.1.1" 2246 | 2247 | object.pick@^1.3.0: 2248 | version "1.3.0" 2249 | resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" 2250 | integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== 2251 | dependencies: 2252 | isobject "^3.0.1" 2253 | 2254 | omggif@^1.0.9: 2255 | version "1.0.10" 2256 | resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" 2257 | integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== 2258 | 2259 | once@^1.3.0, once@^1.4.0: 2260 | version "1.4.0" 2261 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 2262 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 2263 | dependencies: 2264 | wrappy "1" 2265 | 2266 | one-time@^1.0.0: 2267 | version "1.0.0" 2268 | resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" 2269 | integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== 2270 | dependencies: 2271 | fn.name "1.x.x" 2272 | 2273 | optimist@0.6.0: 2274 | version "0.6.0" 2275 | resolved "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz" 2276 | integrity sha512-ubrZPyOU0AHpXkmwqfWolap+eHMwQ484AKivkf0ZGyysd6fUJZl7ow9iu5UNV1vCZv46HQ7EM83IC3NGJ820hg== 2277 | dependencies: 2278 | minimist "~0.0.1" 2279 | wordwrap "~0.0.2" 2280 | 2281 | pako@^1.0.3, pako@^1.0.5: 2282 | version "1.0.11" 2283 | resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" 2284 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 2285 | 2286 | pascalcase@^0.1.1: 2287 | version "0.1.1" 2288 | resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" 2289 | integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== 2290 | 2291 | path-dirname@^1.0.0: 2292 | version "1.0.2" 2293 | resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" 2294 | integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== 2295 | 2296 | path-is-absolute@^1.0.0: 2297 | version "1.0.1" 2298 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 2299 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 2300 | 2301 | path-key@^3.1.0: 2302 | version "3.1.1" 2303 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 2304 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2305 | 2306 | path-parse@^1.0.7: 2307 | version "1.0.7" 2308 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 2309 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 2310 | 2311 | pause-stream@0.0.11: 2312 | version "0.0.11" 2313 | resolved "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz" 2314 | integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== 2315 | dependencies: 2316 | through "~2.3" 2317 | 2318 | peek-readable@^5.0.0: 2319 | version "5.0.0" 2320 | resolved "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz" 2321 | integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== 2322 | 2323 | pend@~1.2.0: 2324 | version "1.2.0" 2325 | resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" 2326 | integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== 2327 | 2328 | picomatch@^2.3.1: 2329 | version "2.3.1" 2330 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 2331 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2332 | 2333 | pify@^2.3.0: 2334 | version "2.3.0" 2335 | resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 2336 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== 2337 | 2338 | pify@^3.0.0: 2339 | version "3.0.0" 2340 | resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" 2341 | integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== 2342 | 2343 | pinkie-promise@^2.0.0: 2344 | version "2.0.1" 2345 | resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" 2346 | integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== 2347 | dependencies: 2348 | pinkie "^2.0.0" 2349 | 2350 | pinkie@^2.0.0: 2351 | version "2.0.4" 2352 | resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" 2353 | integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== 2354 | 2355 | piscina@^3.2.0: 2356 | version "3.2.0" 2357 | resolved "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz" 2358 | integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== 2359 | dependencies: 2360 | eventemitter-asyncresource "^1.0.0" 2361 | hdr-histogram-js "^2.0.1" 2362 | hdr-histogram-percentiles-obj "^3.0.0" 2363 | optionalDependencies: 2364 | nice-napi "^1.0.2" 2365 | 2366 | pkginfo@0.3.x: 2367 | version "0.3.1" 2368 | resolved "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" 2369 | integrity sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A== 2370 | 2371 | pkginfo@0.x.x: 2372 | version "0.4.1" 2373 | resolved "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz" 2374 | integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== 2375 | 2376 | pngjs@^3.3.3: 2377 | version "3.4.0" 2378 | resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" 2379 | integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== 2380 | 2381 | posix-character-classes@^0.1.0: 2382 | version "0.1.1" 2383 | resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" 2384 | integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== 2385 | 2386 | prettyjson@^1.2.2: 2387 | version "1.2.5" 2388 | resolved "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz" 2389 | integrity sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw== 2390 | dependencies: 2391 | colors "1.4.0" 2392 | minimist "^1.2.0" 2393 | 2394 | process-nextick-args@~2.0.0: 2395 | version "2.0.1" 2396 | resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" 2397 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 2398 | 2399 | prompt@0.2.14: 2400 | version "0.2.14" 2401 | resolved "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz" 2402 | integrity sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA== 2403 | dependencies: 2404 | pkginfo "0.x.x" 2405 | read "1.0.x" 2406 | revalidator "0.1.x" 2407 | utile "0.2.x" 2408 | winston "0.8.x" 2409 | 2410 | ps-tree@^1.2.0: 2411 | version "1.2.0" 2412 | resolved "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz" 2413 | integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== 2414 | dependencies: 2415 | event-stream "=3.3.4" 2416 | 2417 | pxls@^2.0.0, pxls@^2.3.1: 2418 | version "2.3.2" 2419 | resolved "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz" 2420 | integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== 2421 | dependencies: 2422 | arr-flatten "^1.1.0" 2423 | compute-dims "^1.1.0" 2424 | flip-pixels "^1.0.2" 2425 | is-browser "^2.1.0" 2426 | is-buffer "^2.0.3" 2427 | to-uint8 "^1.4.1" 2428 | 2429 | quantize@^1.0.2: 2430 | version "1.0.2" 2431 | resolved "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz" 2432 | integrity sha512-25P7wI2UoDbIQsQp50ARkt+5pwPsOq7G/BqvT5xAbapnRoNWMN8/p55H9TXd5MuENiJnm5XICB2H2aDZGwts7w== 2433 | 2434 | queue-microtask@^1.2.2: 2435 | version "1.2.3" 2436 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 2437 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2438 | 2439 | read@1.0.x: 2440 | version "1.0.7" 2441 | resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" 2442 | integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== 2443 | dependencies: 2444 | mute-stream "~0.0.4" 2445 | 2446 | readable-stream@^2.0.2, readable-stream@^2.3.0, readable-stream@^2.3.5: 2447 | version "2.3.7" 2448 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" 2449 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 2450 | dependencies: 2451 | core-util-is "~1.0.0" 2452 | inherits "~2.0.3" 2453 | isarray "~1.0.0" 2454 | process-nextick-args "~2.0.0" 2455 | safe-buffer "~5.1.1" 2456 | string_decoder "~1.1.1" 2457 | util-deprecate "~1.0.1" 2458 | 2459 | readable-stream@^3.4.0: 2460 | version "3.6.0" 2461 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" 2462 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 2463 | dependencies: 2464 | inherits "^2.0.3" 2465 | string_decoder "^1.1.1" 2466 | util-deprecate "^1.0.1" 2467 | 2468 | readable-stream@^3.6.0: 2469 | version "3.6.2" 2470 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" 2471 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 2472 | dependencies: 2473 | inherits "^2.0.3" 2474 | string_decoder "^1.1.1" 2475 | util-deprecate "^1.0.1" 2476 | 2477 | readable-web-to-node-stream@^3.0.2: 2478 | version "3.0.2" 2479 | resolved "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz" 2480 | integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== 2481 | dependencies: 2482 | readable-stream "^3.6.0" 2483 | 2484 | readdirp@^2.2.1: 2485 | version "2.2.1" 2486 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" 2487 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 2488 | dependencies: 2489 | graceful-fs "^4.1.11" 2490 | micromatch "^3.1.10" 2491 | readable-stream "^2.0.2" 2492 | 2493 | rechoir@^0.6.2: 2494 | version "0.6.2" 2495 | resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" 2496 | integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== 2497 | dependencies: 2498 | resolve "^1.1.6" 2499 | 2500 | regex-not@^1.0.0, regex-not@^1.0.2: 2501 | version "1.0.2" 2502 | resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" 2503 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 2504 | dependencies: 2505 | extend-shallow "^3.0.2" 2506 | safe-regex "^1.1.0" 2507 | 2508 | regex-regex@^1.0.0: 2509 | version "1.0.0" 2510 | resolved "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz" 2511 | integrity sha512-FPbEhFTLpxKNgHKay3zMfkHzFK2ebViAlyvsz5euO4kwekH0T6fAL4Sdo2CgQ7Y1tGB5HqQm8SBq7pW5GegvVA== 2512 | 2513 | regexp.prototype.flags@^1.3.0, regexp.prototype.flags@^1.4.3: 2514 | version "1.4.3" 2515 | resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" 2516 | integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== 2517 | dependencies: 2518 | call-bind "^1.0.2" 2519 | define-properties "^1.1.3" 2520 | functions-have-names "^1.2.2" 2521 | 2522 | remove-trailing-separator@^1.0.1: 2523 | version "1.1.0" 2524 | resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" 2525 | integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== 2526 | 2527 | repeat-element@^1.1.2: 2528 | version "1.1.4" 2529 | resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" 2530 | integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== 2531 | 2532 | repeat-string@^1.6.1: 2533 | version "1.6.1" 2534 | resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" 2535 | integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== 2536 | 2537 | resolve-url@^0.2.1: 2538 | version "0.2.1" 2539 | resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" 2540 | integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== 2541 | 2542 | resolve@^1.1.6: 2543 | version "1.22.1" 2544 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" 2545 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 2546 | dependencies: 2547 | is-core-module "^2.9.0" 2548 | path-parse "^1.0.7" 2549 | supports-preserve-symlinks-flag "^1.0.0" 2550 | 2551 | ret@~0.1.10: 2552 | version "0.1.15" 2553 | resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" 2554 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 2555 | 2556 | reusify@^1.0.4: 2557 | version "1.0.4" 2558 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 2559 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2560 | 2561 | revalidator@0.1.x: 2562 | version "0.1.8" 2563 | resolved "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" 2564 | integrity sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg== 2565 | 2566 | rimraf@2.x.x: 2567 | version "2.7.1" 2568 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" 2569 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 2570 | dependencies: 2571 | glob "^7.1.3" 2572 | 2573 | rimraf@^3.0.0: 2574 | version "3.0.2" 2575 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 2576 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2577 | dependencies: 2578 | glob "^7.1.3" 2579 | 2580 | run-parallel@^1.1.9: 2581 | version "1.2.0" 2582 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 2583 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2584 | dependencies: 2585 | queue-microtask "^1.2.2" 2586 | 2587 | safe-buffer@^5.1.1: 2588 | version "5.2.1" 2589 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 2590 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2591 | 2592 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2593 | version "5.1.2" 2594 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 2595 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2596 | 2597 | safe-regex@^1.1.0: 2598 | version "1.1.0" 2599 | resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" 2600 | integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== 2601 | dependencies: 2602 | ret "~0.1.10" 2603 | 2604 | safe-stable-stringify@^2.3.1: 2605 | version "2.3.1" 2606 | resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz" 2607 | integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== 2608 | 2609 | seek-bzip@^1.0.5: 2610 | version "1.0.6" 2611 | resolved "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz" 2612 | integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== 2613 | dependencies: 2614 | commander "^2.8.1" 2615 | 2616 | set-value@^2.0.0, set-value@^2.0.1: 2617 | version "2.0.1" 2618 | resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" 2619 | integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== 2620 | dependencies: 2621 | extend-shallow "^2.0.1" 2622 | is-extendable "^0.1.1" 2623 | is-plain-object "^2.0.3" 2624 | split-string "^3.0.1" 2625 | 2626 | shebang-command@^2.0.0: 2627 | version "2.0.0" 2628 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 2629 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2630 | dependencies: 2631 | shebang-regex "^3.0.0" 2632 | 2633 | shebang-regex@^3.0.0: 2634 | version "3.0.0" 2635 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 2636 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2637 | 2638 | shelljs@^0.8.5: 2639 | version "0.8.5" 2640 | resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" 2641 | integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== 2642 | dependencies: 2643 | glob "^7.0.0" 2644 | interpret "^1.0.0" 2645 | rechoir "^0.6.2" 2646 | 2647 | shush@^1.0.0: 2648 | version "1.0.2" 2649 | resolved "https://registry.npmjs.org/shush/-/shush-1.0.2.tgz" 2650 | integrity sha512-dA7YOFK3a2Ra2SVOucZIDi6qjllTEw3ri7eexmyxyJCYFpYZe0Ja4ZWUqX0NG6DKkC2rw1FEtsrCakERwGQR2g== 2651 | dependencies: 2652 | caller "^1.1.0" 2653 | strip-json-comments "~2.0.1" 2654 | 2655 | side-channel@^1.0.3, side-channel@^1.0.4: 2656 | version "1.0.4" 2657 | resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" 2658 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 2659 | dependencies: 2660 | call-bind "^1.0.0" 2661 | get-intrinsic "^1.0.2" 2662 | object-inspect "^1.9.0" 2663 | 2664 | signal-exit@^3.0.2: 2665 | version "3.0.7" 2666 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" 2667 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2668 | 2669 | simple-swizzle@^0.2.2: 2670 | version "0.2.2" 2671 | resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" 2672 | integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== 2673 | dependencies: 2674 | is-arrayish "^0.3.1" 2675 | 2676 | snapdragon-node@^2.0.1: 2677 | version "2.1.1" 2678 | resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" 2679 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 2680 | dependencies: 2681 | define-property "^1.0.0" 2682 | isobject "^3.0.0" 2683 | snapdragon-util "^3.0.1" 2684 | 2685 | snapdragon-util@^3.0.1: 2686 | version "3.0.1" 2687 | resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" 2688 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 2689 | dependencies: 2690 | kind-of "^3.2.0" 2691 | 2692 | snapdragon@^0.8.1: 2693 | version "0.8.2" 2694 | resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" 2695 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 2696 | dependencies: 2697 | base "^0.11.1" 2698 | debug "^2.2.0" 2699 | define-property "^0.2.5" 2700 | extend-shallow "^2.0.1" 2701 | map-cache "^0.2.2" 2702 | source-map "^0.5.6" 2703 | source-map-resolve "^0.5.0" 2704 | use "^3.1.0" 2705 | 2706 | source-map-resolve@^0.5.0: 2707 | version "0.5.3" 2708 | resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" 2709 | integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== 2710 | dependencies: 2711 | atob "^2.1.2" 2712 | decode-uri-component "^0.2.0" 2713 | resolve-url "^0.2.1" 2714 | source-map-url "^0.4.0" 2715 | urix "^0.1.0" 2716 | 2717 | source-map-url@^0.4.0: 2718 | version "0.4.1" 2719 | resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" 2720 | integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== 2721 | 2722 | source-map@^0.5.6: 2723 | version "0.5.7" 2724 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" 2725 | integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== 2726 | 2727 | split-string@^3.0.1, split-string@^3.0.2: 2728 | version "3.1.0" 2729 | resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" 2730 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2731 | dependencies: 2732 | extend-shallow "^3.0.0" 2733 | 2734 | split@0.3: 2735 | version "0.3.3" 2736 | resolved "https://registry.npmjs.org/split/-/split-0.3.3.tgz" 2737 | integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== 2738 | dependencies: 2739 | through "2" 2740 | 2741 | stack-trace@0.0.x: 2742 | version "0.0.10" 2743 | resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" 2744 | integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== 2745 | 2746 | static-extend@^0.1.1: 2747 | version "0.1.2" 2748 | resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" 2749 | integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== 2750 | dependencies: 2751 | define-property "^0.2.5" 2752 | object-copy "^0.1.0" 2753 | 2754 | stream-combiner@~0.0.4: 2755 | version "0.0.4" 2756 | resolved "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz" 2757 | integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== 2758 | dependencies: 2759 | duplexer "~0.1.1" 2760 | 2761 | streamsearch@^1.1.0: 2762 | version "1.1.0" 2763 | resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" 2764 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 2765 | 2766 | string-to-arraybuffer@^1.0.0: 2767 | version "1.0.2" 2768 | resolved "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz" 2769 | integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== 2770 | dependencies: 2771 | atob-lite "^2.0.0" 2772 | is-base64 "^0.1.0" 2773 | 2774 | string.prototype.trimend@^1.0.5: 2775 | version "1.0.5" 2776 | resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" 2777 | integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== 2778 | dependencies: 2779 | call-bind "^1.0.2" 2780 | define-properties "^1.1.4" 2781 | es-abstract "^1.19.5" 2782 | 2783 | string.prototype.trimstart@^1.0.5: 2784 | version "1.0.5" 2785 | resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" 2786 | integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== 2787 | dependencies: 2788 | call-bind "^1.0.2" 2789 | define-properties "^1.1.4" 2790 | es-abstract "^1.19.5" 2791 | 2792 | string_decoder@^1.1.1, string_decoder@~1.1.1: 2793 | version "1.1.1" 2794 | resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" 2795 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2796 | dependencies: 2797 | safe-buffer "~5.1.0" 2798 | 2799 | strip-dirs@^2.0.0: 2800 | version "2.1.0" 2801 | resolved "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz" 2802 | integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== 2803 | dependencies: 2804 | is-natural-number "^4.0.1" 2805 | 2806 | strip-json-comments@~2.0.1: 2807 | version "2.0.1" 2808 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" 2809 | integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 2810 | 2811 | strtok3@^7.0.0: 2812 | version "7.0.0" 2813 | resolved "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz" 2814 | integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== 2815 | dependencies: 2816 | "@tokenizer/token" "^0.3.0" 2817 | peek-readable "^5.0.0" 2818 | 2819 | supports-preserve-symlinks-flag@^1.0.0: 2820 | version "1.0.0" 2821 | resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 2822 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2823 | 2824 | tar-stream@^1.5.2: 2825 | version "1.6.2" 2826 | resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz" 2827 | integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== 2828 | dependencies: 2829 | bl "^1.0.0" 2830 | buffer-alloc "^1.2.0" 2831 | end-of-stream "^1.0.0" 2832 | fs-constants "^1.0.0" 2833 | readable-stream "^2.3.0" 2834 | to-buffer "^1.1.1" 2835 | xtend "^4.0.0" 2836 | 2837 | text-hex@1.0.x: 2838 | version "1.0.0" 2839 | resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" 2840 | integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== 2841 | 2842 | through@2, through@^2.3.8, through@~2.3, through@~2.3.1: 2843 | version "2.3.8" 2844 | resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 2845 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== 2846 | 2847 | tmp@^0.2.1: 2848 | version "0.2.1" 2849 | resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" 2850 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 2851 | dependencies: 2852 | rimraf "^3.0.0" 2853 | 2854 | to-array-buffer@^3.0.0: 2855 | version "3.2.0" 2856 | resolved "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz" 2857 | integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== 2858 | dependencies: 2859 | flatten-vertex-data "^1.0.2" 2860 | is-blob "^2.0.1" 2861 | string-to-arraybuffer "^1.0.0" 2862 | 2863 | to-buffer@^1.1.1: 2864 | version "1.1.1" 2865 | resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz" 2866 | integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== 2867 | 2868 | to-object-path@^0.3.0: 2869 | version "0.3.0" 2870 | resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" 2871 | integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== 2872 | dependencies: 2873 | kind-of "^3.0.2" 2874 | 2875 | to-regex-range@^2.1.0: 2876 | version "2.1.1" 2877 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" 2878 | integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== 2879 | dependencies: 2880 | is-number "^3.0.0" 2881 | repeat-string "^1.6.1" 2882 | 2883 | to-regex-range@^5.0.1: 2884 | version "5.0.1" 2885 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 2886 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2887 | dependencies: 2888 | is-number "^7.0.0" 2889 | 2890 | to-regex@^3.0.1, to-regex@^3.0.2: 2891 | version "3.0.2" 2892 | resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" 2893 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2894 | dependencies: 2895 | define-property "^2.0.2" 2896 | extend-shallow "^3.0.2" 2897 | regex-not "^1.0.2" 2898 | safe-regex "^1.1.0" 2899 | 2900 | to-uint8@^1.4.1: 2901 | version "1.4.1" 2902 | resolved "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz" 2903 | integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== 2904 | dependencies: 2905 | arr-flatten "^1.1.0" 2906 | clamp "^1.0.1" 2907 | is-base64 "^0.1.0" 2908 | is-float-array "^1.0.0" 2909 | to-array-buffer "^3.0.0" 2910 | 2911 | token-types@^5.0.1: 2912 | version "5.0.1" 2913 | resolved "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz" 2914 | integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== 2915 | dependencies: 2916 | "@tokenizer/token" "^0.3.0" 2917 | ieee754 "^1.2.1" 2918 | 2919 | triple-beam@^1.3.0: 2920 | version "1.3.0" 2921 | resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz" 2922 | integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== 2923 | 2924 | ts-mixer@^6.0.3: 2925 | version "6.0.3" 2926 | resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz" 2927 | integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== 2928 | 2929 | ts-node@^10.9.1: 2930 | version "10.9.1" 2931 | resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" 2932 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 2933 | dependencies: 2934 | "@cspotcode/source-map-support" "^0.8.0" 2935 | "@tsconfig/node10" "^1.0.7" 2936 | "@tsconfig/node12" "^1.0.7" 2937 | "@tsconfig/node14" "^1.0.0" 2938 | "@tsconfig/node16" "^1.0.2" 2939 | acorn "^8.4.1" 2940 | acorn-walk "^8.1.1" 2941 | arg "^4.1.0" 2942 | create-require "^1.1.0" 2943 | diff "^4.0.1" 2944 | make-error "^1.1.1" 2945 | v8-compile-cache-lib "^3.0.1" 2946 | yn "3.1.1" 2947 | 2948 | tslib@^2.5.0: 2949 | version "2.5.0" 2950 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" 2951 | integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== 2952 | 2953 | type-name@^2.0.0: 2954 | version "2.0.2" 2955 | resolved "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz" 2956 | integrity sha512-kkgkuqR/jKdKO5oh/I2SMu2dGbLXoJq0zkdgbxaqYK+hr9S9edwVVGf+tMUFTx2gH9TN2+Zu9JZ/Njonb3cjhA== 2957 | 2958 | typescript@^4.7.4: 2959 | version "4.8.2" 2960 | resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz" 2961 | integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== 2962 | 2963 | unbox-primitive@^1.0.2: 2964 | version "1.0.2" 2965 | resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" 2966 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2967 | dependencies: 2968 | call-bind "^1.0.2" 2969 | has-bigints "^1.0.2" 2970 | has-symbols "^1.0.3" 2971 | which-boxed-primitive "^1.0.2" 2972 | 2973 | unbzip2-stream@^1.0.9: 2974 | version "1.4.3" 2975 | resolved "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz" 2976 | integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== 2977 | dependencies: 2978 | buffer "^5.2.1" 2979 | through "^2.3.8" 2980 | 2981 | undici@^5.21.0: 2982 | version "5.21.2" 2983 | resolved "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz" 2984 | integrity sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ== 2985 | dependencies: 2986 | busboy "^1.6.0" 2987 | 2988 | union-value@^1.0.0: 2989 | version "1.0.1" 2990 | resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" 2991 | integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== 2992 | dependencies: 2993 | arr-union "^3.1.0" 2994 | get-value "^2.0.6" 2995 | is-extendable "^0.1.1" 2996 | set-value "^2.0.1" 2997 | 2998 | unique-string@^1.0.0: 2999 | version "1.0.0" 3000 | resolved "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz" 3001 | integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== 3002 | dependencies: 3003 | crypto-random-string "^1.0.0" 3004 | 3005 | unset-value@^1.0.0: 3006 | version "1.0.0" 3007 | resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" 3008 | integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== 3009 | dependencies: 3010 | has-value "^0.3.1" 3011 | isobject "^3.0.0" 3012 | 3013 | upath@^1.1.1: 3014 | version "1.2.0" 3015 | resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" 3016 | integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== 3017 | 3018 | urix@^0.1.0: 3019 | version "0.1.0" 3020 | resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" 3021 | integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== 3022 | 3023 | use@^3.1.0: 3024 | version "3.1.1" 3025 | resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" 3026 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 3027 | 3028 | utf-8-validate@^5.0.9: 3029 | version "5.0.9" 3030 | resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz" 3031 | integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== 3032 | dependencies: 3033 | node-gyp-build "^4.3.0" 3034 | 3035 | utif@^2.0.1: 3036 | version "2.0.1" 3037 | resolved "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz" 3038 | integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== 3039 | dependencies: 3040 | pako "^1.0.5" 3041 | 3042 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 3043 | version "1.0.2" 3044 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 3045 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 3046 | 3047 | utile@0.2.1, utile@0.2.x: 3048 | version "0.2.1" 3049 | resolved "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz" 3050 | integrity sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg== 3051 | dependencies: 3052 | async "~0.2.9" 3053 | deep-equal "*" 3054 | i "0.3.x" 3055 | mkdirp "0.x.x" 3056 | ncp "0.4.x" 3057 | rimraf "2.x.x" 3058 | 3059 | utils-copy-error@^1.0.0: 3060 | version "1.0.1" 3061 | resolved "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz" 3062 | integrity sha512-RbJcGPZ6Ru2HQk9SWkvbdWNPX58pt4MO5uXsOQRu4LEGWB3LglkRrmnE/Ph1qWg6ywQ0qj95wTz1OeqQ2l8DCA== 3063 | dependencies: 3064 | object-keys "^1.0.9" 3065 | utils-copy "^1.1.0" 3066 | 3067 | utils-copy@^1.0.0, utils-copy@^1.1.0: 3068 | version "1.1.1" 3069 | resolved "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz" 3070 | integrity sha512-+NhJVV+PcxjdpkMrVTqXhQHPldlFGca5XR9YnGyNn7kQ0fMi+DqNLzdnhJ4TJ1HNy/HzB7c+FPg3y+4icY99ZA== 3071 | dependencies: 3072 | const-pinf-float64 "^1.0.0" 3073 | object-keys "^1.0.9" 3074 | type-name "^2.0.0" 3075 | utils-copy-error "^1.0.0" 3076 | utils-indexof "^1.0.0" 3077 | utils-regex-from-string "^1.0.0" 3078 | validate.io-array "^1.0.3" 3079 | validate.io-buffer "^1.0.1" 3080 | validate.io-nonnegative-integer "^1.0.0" 3081 | 3082 | utils-indexof@^1.0.0: 3083 | version "1.0.0" 3084 | resolved "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz" 3085 | integrity sha512-76QBfRJpn4A0P5uTO1x00x+Yog36w2Pab0n+aT9UfUvVa4l+e8k3p7YwNpDvfQ6+aKGZdxZpxcNotNS4YjFcyg== 3086 | dependencies: 3087 | validate.io-array-like "^1.0.1" 3088 | validate.io-integer-primitive "^1.0.0" 3089 | 3090 | utils-regex-from-string@^1.0.0: 3091 | version "1.0.0" 3092 | resolved "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz" 3093 | integrity sha512-xKfdmEF19iUu9TKxFiohQUlQTuqYdV80/CxHiudVI37iEV/OA4HHlXZoc4qvuO1B74EcBVpErBreRO/dpdLeYA== 3094 | dependencies: 3095 | regex-regex "^1.0.0" 3096 | validate.io-string-primitive "^1.0.0" 3097 | 3098 | uuid@^8.3.2: 3099 | version "8.3.2" 3100 | resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" 3101 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 3102 | 3103 | v8-compile-cache-lib@^3.0.1: 3104 | version "3.0.1" 3105 | resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" 3106 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 3107 | 3108 | validate.io-array-like@^1.0.1: 3109 | version "1.0.2" 3110 | resolved "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz" 3111 | integrity sha512-rGLiN0cvY9OWzQcWP+RtqZR/MK9RUz3gKDTCcRLtEQ/BvlanMF5PyqtVIN+CgrIBCv/ypfme9v7r4yMJPYpbNA== 3112 | dependencies: 3113 | const-max-uint32 "^1.0.2" 3114 | validate.io-integer-primitive "^1.0.0" 3115 | 3116 | validate.io-array@^1.0.3, validate.io-array@^1.0.6: 3117 | version "1.0.6" 3118 | resolved "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz" 3119 | integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== 3120 | 3121 | validate.io-buffer@^1.0.1: 3122 | version "1.0.2" 3123 | resolved "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz" 3124 | integrity sha512-6Tad+/QYOxWEXsesKYak1mHOzGdPYS4QeHFImWn7ECi4GR0x3vh7+6+1yoLKNXiklKuTFOxHLG3kZy9tPX0GvQ== 3125 | 3126 | validate.io-integer-primitive@^1.0.0: 3127 | version "1.0.0" 3128 | resolved "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz" 3129 | integrity sha512-4ARGKA4FImVWJgrgttLYsYJmDGwxlhLfDCdq09gyVgohLKKRUfD3VAo1L2vTRCLt6hDhDtFKdZiuYUTWyBggwg== 3130 | dependencies: 3131 | validate.io-number-primitive "^1.0.0" 3132 | 3133 | validate.io-integer@^1.0.5: 3134 | version "1.0.5" 3135 | resolved "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz" 3136 | integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== 3137 | dependencies: 3138 | validate.io-number "^1.0.3" 3139 | 3140 | validate.io-matrix-like@^1.0.2: 3141 | version "1.0.2" 3142 | resolved "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz" 3143 | integrity sha512-86mqLUIkZCRAOVKZvpCB7sDCw1dKBjBkY+C6WO/wLo/jQx0sOqQZz3LLtDw0DCfuAKxRuhSmIpX3nzr0nWrbdw== 3144 | 3145 | validate.io-ndarray-like@^1.0.0: 3146 | version "1.0.0" 3147 | resolved "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz" 3148 | integrity sha512-OV85AosxraPFSXJwzv/d7Cu5/dLiyLtsHmxtHTJcHW1N0uscd0eJ2df1Zk+HdID0eUctUllW/1YuQPUJFv1pTA== 3149 | 3150 | validate.io-nonnegative-integer@^1.0.0: 3151 | version "1.0.0" 3152 | resolved "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz" 3153 | integrity sha512-uOMekPwcl84yg8NR7zgIZCZ9pHCtd9CK1Ri51N+ZJLTe1HyLbmdFdy7ZmfkiHkMvB1pOxeQmd1/LBjKhUD1L3A== 3154 | dependencies: 3155 | validate.io-integer "^1.0.5" 3156 | 3157 | validate.io-number-primitive@^1.0.0: 3158 | version "1.0.0" 3159 | resolved "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz" 3160 | integrity sha512-8rlCe7N0TRTd50dwk4WNoMXNbX/4+RdtqE3TO6Bk0GJvAgbQlfL5DGr/Pl9ZLbWR6CutMjE2cu+yOoCnFWk+Qw== 3161 | 3162 | validate.io-number@^1.0.3: 3163 | version "1.0.3" 3164 | resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz" 3165 | integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== 3166 | 3167 | validate.io-positive-integer@^1.0.0: 3168 | version "1.0.0" 3169 | resolved "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz" 3170 | integrity sha512-eg4LSdyqjICNUZWRilcQ5l+YayRlu6yi+GQsWw1bCmtG9yayOPmLa1fPymEHPPhbvWPAv3w0LLbCsf03pBHZkg== 3171 | dependencies: 3172 | validate.io-integer "^1.0.5" 3173 | 3174 | validate.io-string-primitive@^1.0.0: 3175 | version "1.0.1" 3176 | resolved "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz" 3177 | integrity sha512-TORbkLMdOFkEbPtfdx76FSVQGSAzyUEMxI+pBq5pfFm1ZzIesP+XiGc6eIK75aKu7RA7a8EcqUv5OrY5wfog5w== 3178 | 3179 | which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: 3180 | version "1.0.2" 3181 | resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" 3182 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 3183 | dependencies: 3184 | is-bigint "^1.0.1" 3185 | is-boolean-object "^1.1.0" 3186 | is-number-object "^1.0.4" 3187 | is-string "^1.0.5" 3188 | is-symbol "^1.0.3" 3189 | 3190 | which-collection@^1.0.1: 3191 | version "1.0.1" 3192 | resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" 3193 | integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== 3194 | dependencies: 3195 | is-map "^2.0.1" 3196 | is-set "^2.0.1" 3197 | is-weakmap "^2.0.1" 3198 | is-weakset "^2.0.1" 3199 | 3200 | which-typed-array@^1.1.2: 3201 | version "1.1.8" 3202 | resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz" 3203 | integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== 3204 | dependencies: 3205 | available-typed-arrays "^1.0.5" 3206 | call-bind "^1.0.2" 3207 | es-abstract "^1.20.0" 3208 | for-each "^0.3.3" 3209 | has-tostringtag "^1.0.0" 3210 | is-typed-array "^1.1.9" 3211 | 3212 | which@^1.1.1: 3213 | version "1.3.1" 3214 | resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" 3215 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 3216 | dependencies: 3217 | isexe "^2.0.0" 3218 | 3219 | which@^2.0.1: 3220 | version "2.0.2" 3221 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 3222 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 3223 | dependencies: 3224 | isexe "^2.0.0" 3225 | 3226 | winston-transport@^4.5.0: 3227 | version "4.5.0" 3228 | resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz" 3229 | integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== 3230 | dependencies: 3231 | logform "^2.3.2" 3232 | readable-stream "^3.6.0" 3233 | triple-beam "^1.3.0" 3234 | 3235 | winston@0.8.0: 3236 | version "0.8.0" 3237 | resolved "https://registry.npmjs.org/winston/-/winston-0.8.0.tgz" 3238 | integrity sha512-BoFzn3FEOWlq+1rDbDrbD093E3IRqukS8DYiqtY4vblIFR+5MSGUstAU228MGJa0vodiqm/iU2c8OGw6Iorx1g== 3239 | dependencies: 3240 | async "0.2.x" 3241 | colors "0.6.x" 3242 | cycle "1.0.x" 3243 | eyes "0.1.x" 3244 | pkginfo "0.3.x" 3245 | stack-trace "0.0.x" 3246 | 3247 | winston@0.8.x: 3248 | version "0.8.3" 3249 | resolved "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz" 3250 | integrity sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g== 3251 | dependencies: 3252 | async "0.2.x" 3253 | colors "0.6.x" 3254 | cycle "1.0.x" 3255 | eyes "0.1.x" 3256 | isstream "0.1.x" 3257 | pkginfo "0.3.x" 3258 | stack-trace "0.0.x" 3259 | 3260 | winston@^3.4.0: 3261 | version "3.8.1" 3262 | resolved "https://registry.npmjs.org/winston/-/winston-3.8.1.tgz" 3263 | integrity sha512-r+6YAiCR4uI3N8eQNOg8k3P3PqwAm20cLKlzVD9E66Ch39+LZC+VH1UKf9JemQj2B3QoUHfKD7Poewn0Pr3Y1w== 3264 | dependencies: 3265 | "@dabh/diagnostics" "^2.0.2" 3266 | async "^3.2.3" 3267 | is-stream "^2.0.0" 3268 | logform "^2.4.0" 3269 | one-time "^1.0.0" 3270 | readable-stream "^3.4.0" 3271 | safe-stable-stringify "^2.3.1" 3272 | stack-trace "0.0.x" 3273 | triple-beam "^1.3.0" 3274 | winston-transport "^4.5.0" 3275 | 3276 | wordwrap@~0.0.2: 3277 | version "0.0.3" 3278 | resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" 3279 | integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== 3280 | 3281 | wrappy@1: 3282 | version "1.0.2" 3283 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 3284 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 3285 | 3286 | write-file-atomic@^2.0.0: 3287 | version "2.4.3" 3288 | resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" 3289 | integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== 3290 | dependencies: 3291 | graceful-fs "^4.1.11" 3292 | imurmurhash "^0.1.4" 3293 | signal-exit "^3.0.2" 3294 | 3295 | ws@^8.13.0: 3296 | version "8.13.0" 3297 | resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" 3298 | integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== 3299 | 3300 | xdg-basedir@^3.0.0: 3301 | version "3.0.0" 3302 | resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz" 3303 | integrity sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ== 3304 | 3305 | xtend@^4.0.0: 3306 | version "4.0.2" 3307 | resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 3308 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 3309 | 3310 | yauzl@^2.4.2: 3311 | version "2.10.0" 3312 | resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" 3313 | integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== 3314 | dependencies: 3315 | buffer-crc32 "~0.2.3" 3316 | fd-slicer "~1.1.0" 3317 | 3318 | yn@3.1.1: 3319 | version "3.1.1" 3320 | resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" 3321 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 3322 | 3323 | zlib-sync@^0.1.7: 3324 | version "0.1.7" 3325 | resolved "https://registry.npmjs.org/zlib-sync/-/zlib-sync-0.1.7.tgz" 3326 | integrity sha512-UmciU6ZrIwtwPC8noMzq+kGMdiWwNRZ3wC0SbED4Ew5Ikqx14MqDPRs/Pbk+3rZPh5SzsOgUBs1WRE0iieddpg== 3327 | dependencies: 3328 | nan "^2.14.0" 3329 | --------------------------------------------------------------------------------