From d9e7979f8504bc803c6d04dbb4b0db1125c2c204 Mon Sep 17 00:00:00 2001 From: Mohamed El-Bably Date: Wed, 1 Nov 2023 20:20:13 +0200 Subject: [PATCH] first commit --- .editorconfig | 15 + .env.example | 6 + .eslintignore | 10 + .eslintrc | 20 + .github/workflows/publish.yml | 37 + .gitignore | 42 + .husky/.gitignore | 1 + .husky/commit-msg | 4 + .husky/pre-push | 5 + .npmignore | 31 + .prettierrc | 5 + LICENSE | 21 + README.md | 191 + commitlint.config.js | 9 + jest.config.ts | 19 + package-lock.json | 6680 +++++++++++++++++++++++++++++++++ package.json | 49 + res/class-diagram.png | Bin 0 -> 60019 bytes res/sequence-diagram.png | Bin 0 -> 109931 bytes src/index.ts | 3 + src/slideLimiter.ts | 51 + src/stores/index.ts | 2 + src/stores/memoryStore.ts | 51 + src/stores/redisStore.ts | 51 + src/types.ts | 17 + test/baseStore.spec.ts | 25 + test/memoryStore.spec.ts | 75 + test/redisStore.spec.ts | 102 + test/slideLimiter.spec.ts | 75 + test/utils.ts | 5 + tsconfig.debug.json | 27 + tsconfig.json | 26 + 32 files changed, 7655 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .github/workflows/publish.yml create mode 100644 .gitignore create mode 100644 .husky/.gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-push create mode 100644 .npmignore create mode 100644 .prettierrc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 commitlint.config.js create mode 100644 jest.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 res/class-diagram.png create mode 100644 res/sequence-diagram.png create mode 100644 src/index.ts create mode 100644 src/slideLimiter.ts create mode 100644 src/stores/index.ts create mode 100644 src/stores/memoryStore.ts create mode 100644 src/stores/redisStore.ts create mode 100644 src/types.ts create mode 100644 test/baseStore.spec.ts create mode 100644 test/memoryStore.spec.ts create mode 100644 test/redisStore.spec.ts create mode 100644 test/slideLimiter.spec.ts create mode 100644 test/utils.ts create mode 100644 tsconfig.debug.json create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6bb0988 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +max_line_length = 80 +trim_trailing_whitespace = true + +[*.md] +max_line_length = 0 +trim_trailing_whitespace = false diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..637bddd --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +REDIS_HOST="" +REDIS_PORT=6379 +REDIS_USER= +REDIS_PASSWORD="PASSWORD" +REDIS_DATABASE=0 +REDIS_TLS="false" diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..0dbcb08 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,10 @@ +# /node_modules/* in the project root is ignored by default +# build artefacts +dist/* +coverage/* +# data definition files +**/*.d.ts +# 3rd party libs +/src/public/ +# custom definition files +/src/types/ \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..a3e815d --- /dev/null +++ b/.eslintrc @@ -0,0 +1,20 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": ["plugin:@typescript-eslint/recommended"], + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + "semi": ["error", "always"], + "quotes": ["error", "double"], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-explicit-any": 1, + "@typescript-eslint/no-inferrable-types": [ + "warn", { + "ignoreParameters": true + } + ], + "@typescript-eslint/no-unused-vars": "warn" + } +} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..35305c4 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,37 @@ +name: symspell-ex +on: + push: + branches: + - main +jobs: + Publish: + runs-on: ubuntu-latest + services: + redis: + image: redis + # Set health checks to wait until redis has started + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 6379:6379 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org' + - run: npm install + - run: npm run build + - run: npm run coverage + env: + REDIS_PORT: ${{ job.services.redis.ports[6379] }} + COVERALLS_SERVICE_NAME: "GitHub Action" + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + - run: npm run build + # Publish to npm + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ef777e --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz +*.swp + +data +pids +logs +results +tmp + +# Resources +res/diagrams + +# Coverage reports +coverage +test/training + +# API keys and secrets +.env + +# Dependency directory +node_modules + +# Editors +.idea +*.iml + +# OS metadata +.DS_Store +Thumbs.db + +# Ignore built ts files +dist/**/* +lib/**/* + +# ignore yarn.lock +yarn.lock diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..617efbd --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 0000000..546faeb --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,5 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run test +npm run release -- --release-as patch --skip.tag diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..78f8818 --- /dev/null +++ b/.npmignore @@ -0,0 +1,31 @@ +*.log +npm-debug.log* + +# Coverage directory used by tools like istanbul +coverage +.nyc_output + +# Dependency directories +node_modules + +# npm package lock +package-lock.json +yarn.lock + +# Editors +.idea + +# project files +src +test +data +examples +CHANGELOG.md +.travis.yml +tsconfig.json +megahash.d.ts +.editorconfig +.eslintignore +.eslintrc +.babelrc +.gitignore diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..77e123f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "printWidth": 90, + "bracketSpacing": true +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..935449b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Mohamed El-Bably + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d1e72ef --- /dev/null +++ b/README.md @@ -0,0 +1,191 @@ +# **Slide Limiter** + +A TypeScript implementation of a sliding window rate limiting algorithm that provides rate limiting functionality using different storage mechanisms, including in-memory storage and Redis. It allows you to limit the number of requests or actions that can be performed within a specific time window for a given key or identifier. + +[![Node Version](https://img.shields.io/node/v/slide-limiter.svg)](https://nodejs.org) +[![npm version](https://img.shields.io/npm/v/slide-limiter/latest.svg)](https://www.npmjs.com/package/slide-limiter) +[![Build Status](https://github.com/m-elbably/slide-limiter/workflows/slide-limiter/badge.svg)](https://github.com/m-elbably/slide-limiter/workflows/slide-limiter/badge.svg) +[![Coverage Status](https://coveralls.io/repos/github/m-elbably/slide-limiter/badge.svg?branch=main&t=pKbxsM)](https://coveralls.io/github/m-elbably/slide-limiter?branch=main) +[![License](https://img.shields.io/github/license/m-elbably/slide-limiter.svg)](https://raw.githubusercontent.com/m-elbably/slide-limiter/master/LICENSE) + +## Table of Contents + +- [Introduction](#introduction) +- [Features](#features) +- [Installation](#installation) +- [Sliding Window Algorithm](#sliding-window-rate-limiting-algorithm) +- [Usage](#usage) +- [Notes](#notes) +- [License](#license) + +## Introduction + +Rate limiting is a common technique used in software systems to control the rate at which requests are made. This sliding window rate limiter allows you to restrict the number of requests within a specified time window for a particular key or client. + +## Features + +- Sliding window rate limiting algorithm. +- Dynamic rate limiting. +- In-memory store for tracking requests. +- Advanced Redis store implementation with automatic expiration and cleanup. +- Easily extendable for different stores. + +## Installation + +You can install slide limiter using npm: + +```bash +npm install slide-limiter +# OR +yarn add slide-limiter +``` + +## Sliding Window Rate Limiting Algorithm + +The Sliding Window Algorithm is a time-based method used to track and control the rate at which requests or operations can be made within a specific time window. It's a dynamic system that adapts to changing traffic patterns, making it an effective tool for rate limiting in various applications. + +The central concept behind the Sliding Window Algorithm is the utilization of a dynamic time window that moves with the flow of time. Unlike static methods that reset rate limits at fixed intervals, the sliding window continuously adjusts to the current time, allowing for a more flexible and adaptable approach. + +![](./res/sequence-diagram.png) + +The diagram depicts a sequence of events for handling incoming requests: + +1. **Client** initiates requests to access a service. +2. These requests are intercepted by the **Rate Limiter** to ensure they comply with the defined rate limit. +3. Within each request the following actions occur: + - The **Rate Limiter** checks if the sliding window needs to be adjusted. This is a crucial aspect of sliding window rate limiting. The window slides over time to maintain the rate limit. + - Expired requests that fall outside the sliding window are removed from consideration. + - The timestamp of the current request is added to the sliding window, indicating its occurrence. +4. Each request has two scenarios according to window limit: + - **Within Limit:** If the current request rate is within the defined limit, the **Rate Limiter** forwards the request to the **Service**. The **Service** processes the request and sends a response back to the **Rate Limiter**, which, in turn, forwards the response to the **Client**. + - **Exceeds Limit:** If the current request rate exceeds the defined limit, the **Rate Limiter** responds to the **Client** with a request rejection, indicating that the limit has been exceeded. +5. The process continues in a loop for incoming requests. + +### The Benefits of the Sliding Window Algorithm + +The Sliding Window Algorithm offers several advantages, including: + +1. **Flexibility**: It adapts to varying traffic patterns and prevents abrupt cutoffs when rate limits are exceeded. +2. **Efficiency**: By focusing on a dynamic time window, it optimizes resource usage, avoiding unnecessary restrictions during periods of low traffic. +3. **Fairness**: The algorithm ensures that resources are allocated fairly, preventing any single client or user from monopolizing them. +4. **Protection**: It safeguards against abuse, ensuring that the system remains secure and available even in the face of excessive traffic. + +## Usage +Here's how you can use slide limiter in your project: + +```typescript +import { MemoryStore, SlideLimiter } from "slite-limiter"; + +// Create a MemoryStore instance +const store = new MemoryStore(); +// Create a SlideLimiter instance with options +const options = { + windowMs: 60000, // 1 minute + maxLimit: 10, +}; + +const limiter = new SlideLimiter(store, options); + +// Perform a rate-limited action +const bucket = 'users'; +const key = "user123"; +const remainingRequests = await limiter.hit(bucket, key); + +if (remainingRequests >= 0) { + // Allow the action + console.log(`Action performed. Remaining requests: ${remainingRequests}`); +} else { + // Rate limit exceeded + console.log("Rate limit exceeded. Please try again later."); +} +``` +Default values for `windowMs` and `maxLimit` defined in the SlideLimiter options, but you have the flexibility to change these parameters on a per-request basis. This means that for a specific request, you can override the default values of `windowMs` and `maxLimit` by passing custom values for these parameters when you call the `hit` method. + +Dynamic rate limiting is beneficial when you have different rate limiting requirements for various operations or clients. For example, you might want to allow a higher rate limit for certain premium users or reduce the rate limit for specific resource-intensive operations. Instead of creating a new rate limiter instance for each of these scenarios, you can simply adjust the parameters on the fly when making a rate-limited request. + +### Hits Counting + +`async hit(bucket: string, key: string, options: WindowOptions): Promise` +>`options` parameter is optional, rate limiter options will be used as default + +1. **`bucket`**: The `bucket` parameter is a higher-level categorization that allows you to group rate limits for different resources or endpoints. It can be used to separate the count for specific endpoints or functionalities within your application. In the context of a web API, for example, you might want to rate limit different endpoints differently. By using a `bucket`, you can create distinct rate limits for different parts of your application. For instance, you could have separate `buckets` for `/users/auth`, `/api/orders`, and `/api/profile`, each with its own rate limit configuration. +2. **`key`**: The `key` parameter represents the identifier for the resource or entity you want to rate limit. It is typically associated with a specific user, IP address, or any other unique identifier for the client making the request. For example, if you want to rate limit requests from different users or clients separately, you can use the user's ID or IP address as the `key`. The `key` is an essential part of the rate limiting process because it allows you to track and limit requests on a per-client basis. +3. **`windowMs`**: The `windowMs` parameter represents the time window (in milliseconds) during which rate limiting is applied. It defines the period over which requests are counted and limited. Any requests made within this time window are considered when enforcing rate limits. For example, if `windowMs` is set to 60000 (60 seconds), it means that the rate limiting applies to requests made within the last minute. +4. **`maxLimit`**: The `maxLimit` parameter specifies the maximum number of requests that a client is allowed to make within the defined time window (`windowMs`). It is the threshold beyond which a client's requests will be rate-limited, meaning that they will be denied access until the rate limit resets. + +>By using both the `bucket` and `key` parameters, you can achieve a flexible and effective rate limiting strategy that provides precise control over how different clients interact with various parts of your application. + +**Advantages of Using `bucket`**: + +- **Granular Control**: By using `buckets`, you can apply fine-grained rate limiting rules to different parts of your application. This allows you to prevent excessive requests to critical endpoints while being more permissive with less critical ones. +- **Isolation**: Rate limits for one `bucket` do not affect other `buckets`. This means that exceeding the limit for one endpoint (e.g., `/users/auth`) won't impact the rate limits for other endpoints (e.g., `/api/orders`). +- **Easy Configuration**: It's easier to manage and configure rate limits when they are organized by `buckets`. You can set specific limits for each `bucket` without needing to define separate `SlideLimiter` instances for each endpoint. +- **Scalability**: When your application grows, having `buckets` for different endpoints or features makes it easier to scale your rate limiting strategy. You can adapt the rate limits for specific `buckets` based on their importance and usage patterns. + +### Storage Mechanisms +The library supports two built-in storage mechanisms: + +#### MemoryStore +This stores rate limiting data in memory, making it suitable for single-server applications where rate limiting is local to that server. +`Very basic implementation` + +#### RedisStore +This stores rate limiting data in a Redis database, which is suitable for distributed systems where rate limiting needs to be shared across multiple servers. + +![](./res/class-diagram.png) + +- `RateLimiterStore` is an abstract class that defines the basic structure of a rate limiter store. +- `MemoryStore` and `RedisStore` are concrete classes that inherit from Store and provide specific implementations. +- `SlideLimiter` is the main library class that uses a `RateLimiterStore` for rate limiting. + +### How Redis Store Works + +This Lua script is designed to be executed atomically in Redis, ensuring that rate limiting operations are consistent and thread-safe when multiple requests are made concurrently. It checks if the request count is within the defined limit and records each request's timestamp, allowing for accurate rate limiting enforcement. + +```lua + local current_time = redis.call('TIME') + local bucket = KEYS[1] + local id = KEYS[2] + + local key = bucket .. ":" .. id + local window = tonumber(ARGV[1]) / 1000 + local limit = tonumber(ARGV[2]) + + local trim_time = tonumber(current_time[1]) - window + redis.call('ZREMRANGEBYSCORE', key, 0, trim_time) + local request_count = redis.call('ZCARD', key) + + if request_count < limit then + redis.call('ZADD', key, current_time[1], current_time[1] .. current_time[2]) + redis.call('EXPIRE', key, window) + return limit - request_count - 1; + end + return 0 +``` +It performs the following steps: + +1. **Get the Current Time**: Use `redis.call('TIME')` to retrieve the current time in Redis. +2. **Construct the Key**: Combine the `bucket` and `id` to create a unique key in Redis. This key represents the rate limiting window for a specific resource. +3. **Calculate the Time Window**: Convert the provided `windowMs` (in milliseconds) to seconds by dividing it by 1000. +4. **Check the Request Count**: Check the number of requests in the specified time window by using `redis.call('ZCARD', key)`. This count represents the requests made within the defined time window. +5. **Rate Limit Check**: If the request count is less than the `limit`, it means there's still capacity for more requests. +6. **Add Request Timestamp**: Add the current time to the Redis sorted set with the timestamp as the score. This effectively records the time of the request. +7. **Set Expiry Time**: Set an expiry time on the Redis key using `redis.call('EXPIRE', key, window)`. This ensures that rate limiting data is automatically cleared from Redis after the defined time window. +8. **Calculate Remaining Requests**: Calculate the remaining requests by subtracting the request count from the `limit` and then subtracting 1. This accounts for the current request. +9. **Return Remaining Requests**: Return the number of remaining requests. If it's greater than 0, the request is allowed; otherwise, it's rate-limited. + +#### Using RedisStore (Redis) for rate limiting offers several benefits: + +1. **Distributed and Scalable**: Redis is a distributed, in-memory data store that is well-suited for scaling applications. By using a `RedisStore`, you can implement rate limiting in a distributed system, making it easier to handle high traffic and load balancing across multiple instances. +2. **High-Performance**: Redis is known for its exceptional read and write performance, making it an excellent choice for rate limiting. It can quickly store and retrieve rate-limiting data, reducing the latency of rate limit checks. +3. **Expiration and Automatic Cleanup**: Redis allows you to set expiration times for keys, making it easy to implement automatic data cleanup. This feature is crucial for rate limiting because it ensures that old rate limit data is removed, maintaining the accuracy of the rate limiter. +4. **Atomic Operations**: Redis supports atomic operations, which means rate limit checks and updates can be performed atomically in a single step. This ensures that rate limiting operations are consistent, even in a multi-threaded or distributed environment. + +## Notes + +- This library is a low level implementation for "Sliding Window Rate Limiting Algorithm", it is not a middleware, you can use it to build your own middleware according to your needs. +- Beyond the Limit: Handling excess requests is your responsibility based on the hit remaining limit you may choose to throttle and/or drop requests. + +## License +MIT + diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..380eb30 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,9 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'type-enum': [2, 'always', ['feat', 'chore', 'fix', 'docs', 'style', 'refactor', 'ci', 'test']], + 'type-case': [2, 'always', ['lower-case']], + 'scope-case': [2, 'always', ['sentence-case', 'camel-case']], + 'subject-case': [0, 'always', ['lower-case']] + } +}; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..3d1276c --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,19 @@ +import type {JestConfigWithTsJest} from 'ts-jest' + +export default { + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', { + tsconfig: 'tsconfig.debug.json' + } + ] + }, + testMatch: ['**/__test__/**/*.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'], + testTimeout: 30000, + collectCoverage: true, + collectCoverageFrom: ['src/**/*.{ts,tsx}'], + modulePathIgnorePatterns: ['/lib/'], + coveragePathIgnorePatterns: ['/lib/'] +} as JestConfigWithTsJest; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0f36412 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6680 @@ +{ + "name": "slide-limiter", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "slide-limiter", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ioredis": "^5.3.2" + }, + "devDependencies": { + "@commitlint/cli": "^17.8.0", + "@commitlint/config-conventional": "^17.8.0", + "@types/ioredis": "^5.0.0", + "@types/jest": "^29.5.7", + "@types/node": "^20.8.7", + "coveralls": "^3.1.1", + "husky": "^8.0.3", + "jest": "^29.7.0", + "standard-version": "^9.5.0", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + }, + "engines": { + "node": ">=20.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@commitlint/cli": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.0.tgz", + "integrity": "sha512-D3LdyZYbiRyAChfJMNlAd9f2P9vNQ7GWbI9gN2o7L5hF07QJDqj4z/pcJF3PjDbJWOaUUXla287RdDmmKqH2WQ==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.8.0", + "@commitlint/load": "^17.8.0", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.0.tgz", + "integrity": "sha512-MgiFXujmqAvi7M33C7OSMTznwrVkckrbXe/aZWQ/+KFGLLF6IE50XIcjGrW0/uiDGb/im5qbqF2dh1dCFNa+sQ==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^6.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz", + "integrity": "sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", + "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@commitlint/ensure": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.6.7.tgz", + "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.0.tgz", + "integrity": "sha512-8bR6rxNcWaNprPBdE4ePIOwbxutTQGOsRPYWssX+zjGxnEljzaZSGzFUOMxapYILlf8Tts/O1wPQgG549Rdvdg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "semver": "7.5.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.0.tgz", + "integrity": "sha512-4ihwnqOY4TcJN6iz5Jv1LeYavvBllONwFyGxOIWmCT5s4PNMb43cws2TUdbXTZL1Vq59etGKd5LWYDFPVbs5EA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.8.0", + "@commitlint/parse": "^17.7.0", + "@commitlint/rules": "^17.7.0", + "@commitlint/types": "^17.4.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.0.tgz", + "integrity": "sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.6.7", + "@commitlint/types": "^17.4.4", + "@types/node": "20.5.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/@types/node": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "dev": true + }, + "node_modules/@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.7.0.tgz", + "integrity": "sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^6.0.0", + "conventional-commits-parser": "^4.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse/node_modules/conventional-changelog-angular": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", + "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@commitlint/parse/node_modules/conventional-commits-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", + "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.7.0.tgz", + "integrity": "sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.6.7", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ioredis": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-5.0.0.tgz", + "integrity": "sha512-zJbJ3FVE17CNl5KXzdeSPtdltc4tMT3TzC6fxQS0sQngkbFZ6h+0uTafsRqu+eSLIugf6Yb0Ea0SUuRr42Nk9g==", + "deprecated": "This is a stub types definition. ioredis provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "ioredis": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", + "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", + "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/conventional-changelog-core/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-changelog-core/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", + "dev": true, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/coveralls": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotgitignore/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.571", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.571.tgz", + "integrity": "sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", + "dev": true, + "bin": { + "lcov-parse": "bin/cli.js" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/standard-version": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.25", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "bin": { + "standard-version": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-version/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/standard-version/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/standard-version/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/standard-version/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/standard-version/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8f1dbda --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "slide-limiter", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/m-elbably/slide-limiter#readme", + "repository": "https://github.com/m-elbably/slide-limiter", + "bugs": { + "url": "https://github.com/m-elbably/slide-limiter/issues" + }, + "main": "lib/index.js", + "types": "lib/index.d.ts", + "files": [ + "lib/" + ], + "scripts": { + "husky": "husky install", + "build": "tsc --build", + "release": "standard-version", + "release:major": "npm run release -- --release-as major", + "release:minor": "npm run release -- --release-as minor", + "release:update": "npm run release -- --release-as patch --skip.tag", + "test": "jest", + "coverall": "jest --coverage && cat ./coverage/lcov.info | coveralls" + }, + "dependencies": { + "ioredis": "^5.3.2" + }, + "devDependencies": { + "@commitlint/cli": "^17.8.0", + "@commitlint/config-conventional": "^17.8.0", + "@types/ioredis": "^5.0.0", + "@types/jest": "^29.5.7", + "@types/node": "^20.8.7", + "coveralls": "^3.1.1", + "husky": "^8.0.3", + "jest": "^29.7.0", + "standard-version": "^9.5.0", + "ts-jest": "^29.1.1", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + }, + "keywords": [], + "engines": { + "node": ">=20.0.0", + "npm": ">=9.0.0" + }, + "author": "Mohamed El-Bably (https://github.com/m-elbably)", + "license": "MIT" +} diff --git a/res/class-diagram.png b/res/class-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e7e0a608d9d7f26189fc6dbf2d7ca74bc50ff2 GIT binary patch literal 60019 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 literal 0 HcmV?d00001 diff --git a/res/sequence-diagram.png b/res/sequence-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..dd34d10cdf1a43c92f595986634b3d19ad5ca3c4 GIT binary patch literal 109931 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 (x>b1?&s0hnsvrs95WB95WoC!=(>^{c&%uW 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 TWALkWN+Wo<9XrT$3A+9_iMMbo literal 0 HcmV?d00001 diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..372ddde --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export * from "./types"; +export * from "./stores"; +export * from "./slideLimiter"; diff --git a/src/slideLimiter.ts b/src/slideLimiter.ts new file mode 100644 index 0000000..d250103 --- /dev/null +++ b/src/slideLimiter.ts @@ -0,0 +1,51 @@ +import {RateLimiterOptions, WindowOptions, RateLimiterStore } from "./types"; + +export class SlideLimiter { + protected _store: RateLimiterStore; + protected _options: RateLimiterOptions; + + // Default options + static readonly defaultWindowMs = 60000; + static readonly defaultMaxLimit = 10; + + /** + * Create a rate limiter + * @param {RateLimiterStore} store - The rate limiter store + * @param {RateLimiterOptions} options - The rate limiter options + */ + constructor(store: RateLimiterStore, options?: RateLimiterOptions) { + this._store = store; + this._options = { + windowMs: options?.windowMs || SlideLimiter.defaultWindowMs, + maxLimit: options?.maxLimit || SlideLimiter.defaultMaxLimit + }; + } + + get options(): RateLimiterOptions { + return this._options; + } + + get store(): RateLimiterStore { + return this._store; + } + + /** + * Hit a rate limiter + * @param bucket - The rate limiter bucket name + * @param {string} key - The rate limiter key + * @param {WindowOptions} options - The rate limiter window options + * @returns {Promise} - The number of requests remaining + */ + async hit( + bucket: string, + key: string, + options: WindowOptions = { + windowMs: this._options.windowMs, + maxLimit: this._options.maxLimit + } + ): Promise { + return this._store.hit(bucket, key, { + ...options + }); + } +} diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..983ad09 --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,2 @@ +export * from './memoryStore'; +export * from './redisStore'; diff --git a/src/stores/memoryStore.ts b/src/stores/memoryStore.ts new file mode 100644 index 0000000..e785808 --- /dev/null +++ b/src/stores/memoryStore.ts @@ -0,0 +1,51 @@ +import {RateLimiterStore, WindowOptions} from "../types"; + +export interface MemoryStoreBucket { + [key: string]: Array +} +export class MemoryStore extends RateLimiterStore { + protected _buckets: { + [key: string]: MemoryStoreBucket + } = {}; + + private slideWindow( + bucket: string, + key: string, + now: number, + windowMs: number + ): void { + const keyWindow = this._buckets[bucket][key] || []; + while (keyWindow[0] <= now - windowMs) { + keyWindow.shift(); + } + } + + get buckets(): { [key: string]: MemoryStoreBucket } { + return this._buckets; + } + + async hit( + bucket: string, + key: string, + options: WindowOptions + ): Promise { + const { windowMs, maxLimit} = options; + const now = Date.now(); + if(this._buckets[bucket] == null) { + this._buckets[bucket] = { + [key]: [] + }; + } + + if(this._buckets[bucket][key] == null) { + this._buckets[bucket][key] = []; + } + + this.slideWindow(bucket, key, now, windowMs); + if(this._buckets[bucket][key].length < maxLimit) { + this._buckets[bucket][key].push(now); + } + + return maxLimit - this._buckets[bucket][key].length; + } +} diff --git a/src/stores/redisStore.ts b/src/stores/redisStore.ts new file mode 100644 index 0000000..e6e32c5 --- /dev/null +++ b/src/stores/redisStore.ts @@ -0,0 +1,51 @@ +import Redis from "ioredis"; +import {RateLimiterStore, WindowOptions} from "../types"; + +export class RedisStore extends RateLimiterStore { + constructor(private _db: Redis) { + super(); + this.initialize(); + } + + private initialize() { + this._db.defineCommand('hit', { + numberOfKeys: 2, + lua: ` + local current_time = redis.call('TIME') + local bucket = KEYS[1] + local id = KEYS[2] + + local key = bucket .. ":" .. id + local window = tonumber(ARGV[1]) / 1000 + local limit = tonumber(ARGV[2]) + + local trim_time = tonumber(current_time[1]) - window + redis.call('ZREMRANGEBYSCORE', key, 0, trim_time) + local request_count = redis.call('ZCARD', key) + + if request_count < limit then + redis.call('ZADD', key, current_time[1], current_time[1] .. current_time[2]) + redis.call('EXPIRE', key, window) + return limit - request_count - 1; + end + return 0 + ` + }) + } + + get db(): Redis { + return this._db; + } + + async hit( + bucket: string, + key: string, + options: WindowOptions + ): Promise { + const { + windowMs, + maxLimit + } = options; + return (this._db as any).hit(bucket, key, windowMs, maxLimit); + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..5550e83 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,17 @@ +export interface WindowOptions { + windowMs: number; + maxLimit: number; +} +export interface RateLimiterOptions extends WindowOptions {} + +export class RateLimiterStore { + constructor(protected config = {}) {} + + async hit( + bucket: string, + key: string, + options?: WindowOptions + ): Promise { + throw new Error('Method Not implemented'); + } +} diff --git a/test/baseStore.spec.ts b/test/baseStore.spec.ts new file mode 100644 index 0000000..107cda4 --- /dev/null +++ b/test/baseStore.spec.ts @@ -0,0 +1,25 @@ +import { RateLimiterStore, WindowOptions } from '../src'; + +class ExStore extends RateLimiterStore { + async hit(bucket: string, key: string, options: WindowOptions): Promise { + return super.hit(bucket, key, options); + } +} + +describe('ExtendedStore', () => { + let store: ExStore; + + beforeEach(() => { + store = new ExStore(); + }); + + it('should initialize correctly', () => { + expect(store).toBeInstanceOf(RateLimiterStore); + }); + + it('should return error if base class `hit` invoked', async () => { + await expect(store.hit('bucket', 'key', { windowMs: 5000, maxLimit: 5 })) + .rejects + .toThrowError(); + }); +}); diff --git a/test/memoryStore.spec.ts b/test/memoryStore.spec.ts new file mode 100644 index 0000000..6d93247 --- /dev/null +++ b/test/memoryStore.spec.ts @@ -0,0 +1,75 @@ +import { MemoryStore } from '../src'; +import {Utils} from "./utils"; + +describe('MemoryStore', () => { + let store: MemoryStore; + + beforeEach(() => { + store = new MemoryStore(); + }); + + it('should initialize correctly', () => { + expect(store.buckets).toEqual({}); + }); + + it('should correctly slide the time window', async () => { + const bucket = 'main'; + const key = 't1'; + const key2 = 't2'; + const windowMs = 2000; // 5 seconds + const maxLimit = 5; + + // Initial hit + await store.hit(bucket, key, { windowMs, maxLimit}); + await store.hit(bucket, key2, { windowMs, maxLimit}); + await Utils.wait(2000); + + // New hits will enforce window sliding + await store.hit(bucket, key, { windowMs, maxLimit }); + await store.hit(bucket, key, { windowMs, maxLimit }); + await store.hit(bucket, key2, { windowMs, maxLimit }); + const remaining = await store + .hit(bucket, key, { windowMs, maxLimit}); + + // Expect the oldest timestamp to be removed + expect(remaining).toBe(2); + }); + + it('should correctly limit requests within the window', async () => { + const bucket = 'main'; + const key = 't3'; + const windowMs = 5000; // 5 seconds + const maxLimit = 3; + + // Hit the limiter three times within the window + for (let i = 0; i < maxLimit; i++) { + const remaining = await store.hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(maxLimit - (i + 1)); + } + + // The fourth request should return 0 remaining requests + const remaining = await store.hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(0); + }); + + it('should not allow requests beyond the max limit', async () => { + const bucket = 'main'; + const key = 't4'; + const windowMs = 5000; // 5 seconds + const maxLimit = 2; + + // Hit the limiter twice within the window + for (let i = 0; i < maxLimit; i++) { + const remaining = await store.hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(maxLimit - (i + 1)); + } + + // The third request should return 0 remaining requests + const remaining = await store.hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(0); + + // Attempt one more request, which should return 0 remaining requests + const extraRequest = await store.hit(bucket, key, { windowMs, maxLimit }); + expect(extraRequest).toBe(0); + }); +}); diff --git a/test/redisStore.spec.ts b/test/redisStore.spec.ts new file mode 100644 index 0000000..0f99220 --- /dev/null +++ b/test/redisStore.spec.ts @@ -0,0 +1,102 @@ +import Redis, { RedisOptions } from 'ioredis'; +import { RedisStore } from '../src'; +import { Utils } from './utils'; + +const { env } = process; + +describe('RedisStore', () => { + let db: Redis; + let store: RedisStore; + + beforeAll(async () => { + db = new Redis({ + host: env.REDIS_HOST || 'localhost', + port: env.REDIS_PORT || 6379, + password: env.REDIS_PASSWORD, + db: env.REDIS_DATABASE || 0, + lazyConnect: true + } as RedisOptions); + + await db.connect(); + store = new RedisStore(db); + }); + + afterAll(async () => { + if(db != null) { + db.disconnect(); + } + }); + + it('should initialize correctly', () => { + expect(store.db).toBe(db); + }); + + it('should correctly slide the time window', async () => { + const bucket = 'main'; + const key = 't1'; + const key2 = 't2'; + const windowMs = 2000; // 5 seconds + const maxLimit = 5; + + // Initial hit + await store.hit(bucket, key, { windowMs, maxLimit}); + await store.hit(bucket, key2, { windowMs, maxLimit}); + await Utils.wait(2000); + + // New hits will enforce window sliding + await store.hit(bucket, key, { windowMs, maxLimit }); + await store.hit(bucket, key, { windowMs, maxLimit }); + await store.hit(bucket, key2, { windowMs, maxLimit}); + const remaining = await store + .hit(bucket, key, { windowMs, maxLimit}); + + // Expect the oldest timestamp to be removed + expect(remaining).toBe(2); + }); + + // We must use different bucket or key to get accurate data + // because current case will be executed directly after the previous case + // which will hit the same previews key window and return invalid remaining value + it('should correctly limit requests within the window', async () => { + const bucket = 'main'; + const key = 't3'; + const windowMs = 5000; // 5 seconds + const maxLimit = 3; + + // Hit the limiter three times within the window + for (let i = 0; i < maxLimit; i++) { + const remaining = await store + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(maxLimit - (i + 1)); + } + + // The fourth request should return 0 remaining requests + const remaining = await store + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(0); + }); + + it('should not allow requests beyond the max limit', async () => { + const bucket = 'main'; + const key = 't4'; + const windowMs = 5000; // 5 seconds + const maxLimit = 2; + + // Hit the limiter twice within the window + for (let i = 0; i < maxLimit; i++) { + const remaining = await store + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(maxLimit - (i + 1)); + } + + // The third request should return 0 remaining requests + const remaining = await store + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(0); + + // Attempt one more request, which should return 0 remaining requests + const extraRequest = await store + .hit(bucket, key, { windowMs, maxLimit }); + expect(extraRequest).toBe(0); + }); +}); diff --git a/test/slideLimiter.spec.ts b/test/slideLimiter.spec.ts new file mode 100644 index 0000000..ec04527 --- /dev/null +++ b/test/slideLimiter.spec.ts @@ -0,0 +1,75 @@ +import {SlideLimiter, MemoryStore, RateLimiterStore} from '../src'; + +describe('SlideLimiter', () => { + let store: RateLimiterStore; + let slideLimiter: SlideLimiter; + + beforeEach(() => { + store = new MemoryStore(); + slideLimiter = new SlideLimiter(store); + }); + + it('should initialize with default options', () => { + expect(slideLimiter.options.windowMs).toBe(SlideLimiter.defaultWindowMs); + expect(slideLimiter.options.maxLimit).toBe(SlideLimiter.defaultMaxLimit); + }); + + it('should initialize with custom options', () => { + const windowMs = 5000; // 5 seconds + const maxLimit = 3; + + const slideLimiter = new SlideLimiter(new MemoryStore(), { + windowMs, + maxLimit + }); + expect(slideLimiter.options.windowMs).toBe(windowMs); + expect(slideLimiter.options.maxLimit).toBe(maxLimit); + }); + + it('should return current store', () => { + expect(slideLimiter.store).toBe(store); + }); + + it('should allow requests within the window', async () => { + const bucket = 'main'; + const key = 't1'; + const windowMs = 5000; // 5 seconds + const maxLimit = 3; + + // Hit the limiter three times within the window + for (let i = 0; i < maxLimit; i++) { + const remaining = await slideLimiter + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(maxLimit - (i + 1)); + } + + // The fourth request should return 0 remaining requests + const remaining = await slideLimiter + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(0); + }); + + it('should not allow requests beyond the max limit', async () => { + const bucket = 'main'; + const key = 't2'; + const windowMs = 5000; // 5 seconds + const maxLimit = 2; + + // Hit the limiter twice within the window + for (let i = 0; i < maxLimit; i++) { + const remaining = await slideLimiter + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(maxLimit - (i + 1)); + } + + // The third request should return 0 remaining requests + const remaining = await slideLimiter + .hit(bucket, key, { windowMs, maxLimit }); + expect(remaining).toBe(0); + + // Attempt one more request, which should return 0 remaining requests + const extraRequest = await slideLimiter + .hit(bucket, key, { windowMs, maxLimit }); + expect(extraRequest).toBe(0); + }); +}); diff --git a/test/utils.ts b/test/utils.ts new file mode 100644 index 0000000..5f46a19 --- /dev/null +++ b/test/utils.ts @@ -0,0 +1,5 @@ +export class Utils { + static async wait(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); + } +} diff --git a/tsconfig.debug.json b/tsconfig.debug.json new file mode 100644 index 0000000..269faa5 --- /dev/null +++ b/tsconfig.debug.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es2017", + "module": "commonjs", + "esModuleInterop": true, + "declaration": true, + "allowSyntheticDefaultImports": true, + "noImplicitAny": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "sourceMap": true, + "outDir": "./lib", + "baseUrl": "./" + }, + "include": [ + "src/**/*", + "types/**/*", + "test/**/*" + ], + "exclude": [ + "node_modules/**", + "lib" + ], + "ts-node": { + "files": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c158e24 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "es2017", + "module": "commonjs", + "esModuleInterop": true, + "declaration": true, + "allowSyntheticDefaultImports": true, + "noImplicitAny": true, + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "sourceMap": false, + "outDir": "./lib", + "baseUrl": "./" + }, + "include": [ + "src/**/*", + "types/**/*" + ], + "exclude": [ + "node_modules/**", + "lib" + ], + "ts-node": { + "files": true + } +}