diff --git a/articles/sse-js-crypto-feed/docker-compose.yml b/articles/sse-js-crypto-feed/docker-compose.yml index 2159893..2656738 100644 --- a/articles/sse-js-crypto-feed/docker-compose.yml +++ b/articles/sse-js-crypto-feed/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.8' services: sse-app: diff --git a/articles/websocket-chatbot-js/.dockerignore b/articles/websocket-chatbot-js/.dockerignore new file mode 100644 index 0000000..a1788e9 --- /dev/null +++ b/articles/websocket-chatbot-js/.dockerignore @@ -0,0 +1,6 @@ +node_modules +npm-debug.log +Dockerfile +docker-compose.yml +.git +.env diff --git a/articles/websocket-chatbot-js/.env.example b/articles/websocket-chatbot-js/.env.example new file mode 100644 index 0000000..00c3ed3 --- /dev/null +++ b/articles/websocket-chatbot-js/.env.example @@ -0,0 +1,2 @@ +# Copy this file to .env and set your ngrok auth token +NGROK_AUTHTOKEN= diff --git a/articles/websocket-chatbot-js/.gitignore b/articles/websocket-chatbot-js/.gitignore new file mode 100644 index 0000000..b112ec4 --- /dev/null +++ b/articles/websocket-chatbot-js/.gitignore @@ -0,0 +1,5 @@ +# Node Modules +node_modules + +# Environment variables +.env diff --git a/articles/websocket-chatbot-js/Dockerfile b/articles/websocket-chatbot-js/Dockerfile new file mode 100644 index 0000000..f9ad2e5 --- /dev/null +++ b/articles/websocket-chatbot-js/Dockerfile @@ -0,0 +1,7 @@ +FROM node:18-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev +COPY . . +EXPOSE 3000 +CMD ["npm", "start"] diff --git a/articles/websocket-chatbot-js/README.md b/articles/websocket-chatbot-js/README.md new file mode 100644 index 0000000..7af946c --- /dev/null +++ b/articles/websocket-chatbot-js/README.md @@ -0,0 +1,49 @@ +# Chatbot WebSocket Demo + +This project provides a minimal WebSocket server and a React + Tailwind CSS client. It can be used to experiment with WebSocket connections for a chatbot-style application or to run load tests with Gatling. + +## Features + +- Node.js server with a handcrafted WebSocket implementation. +- React frontend styled with Tailwind CSS and a simple SaaS look for **Acme Healthcare**. +- Gatling load test examples in JavaScript and TypeScript. +- Docker and ngrok setup for exposing the server to the internet, for remote load testing with Gatling Enterprise Edition. + +## Running the Server + +```bash +node server.js +``` + +Open your browser to `http://localhost:3000` and chat with the bot. Messages are echoed back with an "AI" prefix. + +To gracefully end a session, send the message `close` and the server will close the WebSocket connection. + +## Running a load test locally + +To simulate thousands of concurrent connections using [Gatling](https://gatling.io/). Point the WebSocket scenario at `ws://localhost:3000` and configure the desired number of virtual users. There is a companion sample load test available [WebSockets JS load test](https://github.com/stb13579/WebSocketTestJS). + + +## Running a load test remotely + +To test the WebSocket server from a remote location, you can use the included Docker and ngrok setup to expose the server to the internet. This is useful for load testing with Gatling Enterprise Edition. First, expose the server using Docker and ngrok as described below. Then, configure your Gatling scenario to point to the ngrok URL. + +### Application setup with Docker and ngrok + +This repository includes a `Dockerfile` and `docker-compose.yml` to expose the server through [ngrok](https://ngrok.com) for remote load testing. + +1. Create an ngrok account and obtain an auth token. +2. Copy `.env.example` to `.env` and add your token: `NGROK_AUTHTOKEN=`. +3. Start the stack: + +```bash +docker compose up --build +``` + +The ngrok service will print a forwarding URL such as `https://XXXX.ngrok-free.app`. Use this URL in your remote load testing tool to target the WebSocket server. + +### Gatling Enterprise Edition setup +1. Log in to your Gatling Enterprise Edition account. +2. Create a new simulation and configure it to use the ngrok URL as the WebSocket endpoint. +3. Run your load test and analyze the results in the Gatling dashboard. +4. Monitor the server logs in the Docker container to see incoming connections and messages. \ No newline at end of file diff --git a/articles/websocket-chatbot-js/docker-compose.yml b/articles/websocket-chatbot-js/docker-compose.yml new file mode 100644 index 0000000..02632a7 --- /dev/null +++ b/articles/websocket-chatbot-js/docker-compose.yml @@ -0,0 +1,21 @@ +version: "3.9" + +services: + app: + build: + context: . + dockerfile: Dockerfile + ports: + - "3000:3000" + + ngrok: + image: ngrok/ngrok:latest + command: + - http + - app:3000 + environment: + NGROK_AUTHTOKEN: ${NGROK_AUTHTOKEN:?NGROK_AUTHTOKEN must be set} + depends_on: + - app + ports: + - "4040:4040" diff --git a/articles/websocket-chatbot-js/gatling/.gitignore b/articles/websocket-chatbot-js/gatling/.gitignore new file mode 100644 index 0000000..51b09c6 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +target/ + +# Gatling run results +results/ diff --git a/articles/websocket-chatbot-js/gatling/README.md b/articles/websocket-chatbot-js/gatling/README.md new file mode 100644 index 0000000..9396bd9 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/README.md @@ -0,0 +1,51 @@ +# Gatling JS - JavaScript and TypeScript demo projects + +A simple showcase of JavaScript and TypeScript NPM projects using Gatling JS. Please also check out the [introduction to JavaScript scripting](https://docs.gatling.io/tutorials/scripting-intro-js/) in the Gatling documentation. + +## Prerequisites + +You need [Node.js](https://nodejs.org/en/download) v18 or later (LTS versions only) and npm v8 or later (included with Node.js). + +## Use demo project + +Run the typeScript sample: + +```shell +cd typescript +npm install +npx gatling run --typescript --simulation basicSimulation # automatically download Gatling runtime, build the project, and run the basicSimulation simulation +``` + +Or the JavaScript sample: + +```shell +cd javascript +npm install +npx gatling run --simulation basicSimulation # automatically download Gatling runtime, build the project, and run the basicSimulation simulation +``` + +You can also launch the [Gatling Recorder](https://docs.gatling.io/tutorials/recorder/) and use it to capture browser-based actions and help create a realistic user scenario: + +```shell +npx gatling recorder +``` + +The `gatling` command-line tool has a built-in help function: + +```shell +npx gatling --help # List all available commands +npx gatling run --help # List options for the "run" command (--help also works for all other available commands) +``` + +## Included helper scripts + +Note that both sample projects include a few aliases in the `package.json`'s `scripts` section, which you can use for convenience or refer to as examples: + +```shell +npm run clean # Delete Gatling bundled code and generated reports +npm run format # Format code with prettier +npm run check # TypeScript project only, type check but don't build or run +npm run build # Build project but don't run +npm run basicSimulation # Run the included basicSimulation simulation +npm run recorder # Starts the Gatling Recorder +``` diff --git a/articles/websocket-chatbot-js/gatling/javascript/.gatling/example.package.conf b/articles/websocket-chatbot-js/gatling/javascript/.gatling/example.package.conf new file mode 100644 index 0000000..edac682 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/.gatling/example.package.conf @@ -0,0 +1,54 @@ +# Learn more about Configuration as Code: https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code +# This file is full deployment configuration file example. +# Please note all these configuration fields, or even this file, are optional. + +gatling.enterprise.package { + # Consistent deployment using an existing package ID + # https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code/#consistent-deployment-with-id + # id = "00000000-0000-0000-0000-000000000000" + name = "My package name" + team = "Default team" # or ID with team = "00000000-0000-0000-0000-000000000000" + default { + simulation { + locations = [ + { + name: "Europe - Paris", + size: 2, + weight: 30 + }, + { + name: "AP Pacific - Mumbai", + size: 2, + weight: 70 + } + ] + parameters { + ignoreDefaults = false + systemProperties { + # System properties names should be surrounded by quotes + # Otherwise, it would be interpreted as HOCON keys + "com.example.prop.1" = "default value from system prop 1" + "com.example.prop.2" = "default value from system prop 2" + } + environmentVariables { + MY_SIMULATION_ENV_VAR_1 = "default value from environment 1" + MY_SIMULATION_ENV_VAR_2 = "default value from environment 2" + } + } + timeWindow { + rampUp = 10 # in seconds + rampDown = 10 # in seconds + } + } + } + simulations = [ + { + # Consistent deployment using an existing simulation ID + # https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code/#consistent-deployment-with-id + # id = "00000000-0000-0000-0000-000000000001" + name = "My simulation name" + # Name of the simulation (i.e.: prefix of the simulation file src/*.gatling.js) + simulation = "basicSimulation" + } + ] +} diff --git a/articles/websocket-chatbot-js/gatling/javascript/.gatling/package.conf b/articles/websocket-chatbot-js/gatling/javascript/.gatling/package.conf new file mode 100644 index 0000000..f095688 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/.gatling/package.conf @@ -0,0 +1,2 @@ +# See `example.package.conf` for a full deployment configuration file example +# Learn more about Configuration as Code: https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code diff --git a/articles/websocket-chatbot-js/gatling/javascript/.gitignore b/articles/websocket-chatbot-js/gatling/javascript/.gitignore new file mode 100644 index 0000000..b5fc6c0 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/.gitignore @@ -0,0 +1,4 @@ +# Node modules +node_modules/ +# Results files +target/ diff --git a/articles/websocket-chatbot-js/gatling/javascript/.prettierignore b/articles/websocket-chatbot-js/gatling/javascript/.prettierignore new file mode 100644 index 0000000..aa8afe6 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/.prettierignore @@ -0,0 +1,2 @@ +node_modules/ +target/ diff --git a/articles/websocket-chatbot-js/gatling/javascript/.prettierrc b/articles/websocket-chatbot-js/gatling/javascript/.prettierrc new file mode 100644 index 0000000..0660e84 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/.prettierrc @@ -0,0 +1,16 @@ +{ + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "always", + "requirePragma": false, + "endOfLine": "lf", + "embeddedLanguageFormatting": "auto" +} diff --git a/articles/websocket-chatbot-js/gatling/javascript/README.md b/articles/websocket-chatbot-js/gatling/javascript/README.md new file mode 100644 index 0000000..fa9118e --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/README.md @@ -0,0 +1,45 @@ +# Gatling JavaScript WebSocket Demo + +A showcase of the WebSocket testing using Gatling's JavaScript SDK. Please also check out the [introduction to JavaScript scripting](https://docs.gatling.io/tutorials/scripting-intro-js/) in the Gatling documentation. + +## Prerequisites + +You need [Node.js](https://nodejs.org/en/download) v18 or later (LTS versions only) and npm v8 or later (included with Node.js). + +## Use WebSocket demo project + +Run the JavaScript sample test: + +```shell +cd javascript +npm install +npx gatling run --simulation basicSimulation # automatically download Gatling runtime, build the project, and run the basicSimulation simulation +``` + +The `gatling` command-line tool has a built-in help function: + +```shell +npx gatling --help # List all available commands +npx gatling run --help # List options for the "run" command (--help also works for all other available commands) +``` + +## Included helper scripts + +Note that both sample projects include a few aliases in the `package.json`'s `scripts` section, which you can use for convenience or refer to as examples: + +```shell +npm run clean # Delete Gatling bundled code and generated reports +npm run format # Format code with prettier +npm run build # Build project but don't run +npm run basicSimulation # Run the included basicSimulation simulation +``` + +## Keep learning + +Here are 2 challenges to help you expand your websocket testing skills: + +1. **Add more specific response validation:**: Enhance the simulation by adding more specific checks for the chatbot's responses. For example, check if the response contains certain keywords or phrases that are expected based on the question asked. + +2. **Implement Error Handling**: Enhance the simulation by implementing error handling for websocket connections. Simulate scenarios where the connection drops or the server returns an error message. + +Send your solutions to Marketing@gatling.io for a chance to win some company swag. \ No newline at end of file diff --git a/articles/websocket-chatbot-js/gatling/javascript/package-lock.json b/articles/websocket-chatbot-js/gatling/javascript/package-lock.json new file mode 100644 index 0000000..234e4de --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/package-lock.json @@ -0,0 +1,2463 @@ +{ + "name": "gatling-js-demo", + "version": "3.14.306", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gatling-js-demo", + "version": "3.14.306", + "dependencies": { + "@gatling.io/core": "3.14.306", + "@gatling.io/http": "3.14.306" + }, + "devDependencies": { + "@gatling.io/cli": "3.14.306", + "prettier": "3.6.2", + "rimraf": "6.0.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", + "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", + "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", + "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", + "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", + "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", + "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", + "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", + "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", + "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", + "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", + "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", + "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", + "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", + "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", + "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", + "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", + "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", + "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", + "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", + "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", + "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", + "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", + "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", + "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", + "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", + "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@gatling.io/cli": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/cli/-/cli-3.14.306.tgz", + "integrity": "sha512-CZgBabeKFMhVCFTmwBkle4r0O1uW+NZFzm/dRuPTtdoPNO/0+W2I7u9/Df5XXMo5bdvpAMu3/cKXAPGVVzEXTw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jspm/core": "2.1.0", + "archiver": "7.0.1", + "commander": "14.0.0", + "esbuild": "0.25.6", + "esbuild-plugin-tsc": "0.5.0", + "import-meta-resolve": "4.1.0", + "make-fetch-happen": "14.0.3", + "node-stream-zip": "1.15.0", + "readline-sync": "1.4.10" + }, + "bin": { + "gatling": "target/index.js" + } + }, + "node_modules/@gatling.io/core": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/core/-/core-3.14.306.tgz", + "integrity": "sha512-YJQCcn0DkXmbY2ZDkFb1qP55uqm87LHBuNPPLL1iXbFWVFh/liG9onf1JU5s/e4lefEhBjARmlZG2buHoFVSVQ==", + "license": "Apache-2.0", + "dependencies": { + "@gatling.io/jvm-types": "3.14.306" + } + }, + "node_modules/@gatling.io/http": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/http/-/http-3.14.306.tgz", + "integrity": "sha512-GOjBO5A4Uq3Th4rpcoVW+eY4fJo/EyutAvCwLOAXuxDQvVvYaqK7POMQ7z+aQ3CaKKnGtaynmNU4sFoqukBfgQ==", + "license": "Apache-2.0", + "dependencies": { + "@gatling.io/core": "3.14.306", + "@gatling.io/jvm-types": "3.14.306" + } + }, + "node_modules/@gatling.io/jvm-types": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/jvm-types/-/jvm-types-3.14.306.tgz", + "integrity": "sha512-6X3oTWRRTid6E+oiIyjLPvaM27zOeLfbqptglx7O72JO91ufqdssMSmizeo4Dsdr+t5elZahF7YUQEGgtTKX5Q==", + "license": "Apache-2.0" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jspm/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.1.0.tgz", + "integrity": "sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/archiver-utils/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/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/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/archiver/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/archiver/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/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/archiver/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "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/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "dev": true, + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "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/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/compress-commons/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/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/compress-commons/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/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/crc32-stream/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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", + "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.6", + "@esbuild/android-arm": "0.25.6", + "@esbuild/android-arm64": "0.25.6", + "@esbuild/android-x64": "0.25.6", + "@esbuild/darwin-arm64": "0.25.6", + "@esbuild/darwin-x64": "0.25.6", + "@esbuild/freebsd-arm64": "0.25.6", + "@esbuild/freebsd-x64": "0.25.6", + "@esbuild/linux-arm": "0.25.6", + "@esbuild/linux-arm64": "0.25.6", + "@esbuild/linux-ia32": "0.25.6", + "@esbuild/linux-loong64": "0.25.6", + "@esbuild/linux-mips64el": "0.25.6", + "@esbuild/linux-ppc64": "0.25.6", + "@esbuild/linux-riscv64": "0.25.6", + "@esbuild/linux-s390x": "0.25.6", + "@esbuild/linux-x64": "0.25.6", + "@esbuild/netbsd-arm64": "0.25.6", + "@esbuild/netbsd-x64": "0.25.6", + "@esbuild/openbsd-arm64": "0.25.6", + "@esbuild/openbsd-x64": "0.25.6", + "@esbuild/openharmony-arm64": "0.25.6", + "@esbuild/sunos-x64": "0.25.6", + "@esbuild/win32-arm64": "0.25.6", + "@esbuild/win32-ia32": "0.25.6", + "@esbuild/win32-x64": "0.25.6" + } + }, + "node_modules/esbuild-plugin-tsc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-tsc/-/esbuild-plugin-tsc-0.5.0.tgz", + "integrity": "sha512-t9j90NnMhAGWzS0SKX3zNa/XeWcUanqKaFe36CSmXiB2nYFdaSzKY9pBZTvGV7NGImxE1BktOOlVpQyYnUTVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-comments": "^2.0.1" + }, + "peerDependencies": { + "typescript": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "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/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/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "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/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", + "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/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/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/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/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/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/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "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/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.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-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "optional": true + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "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/string-width-cjs/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/string-width-cjs/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/string-width-cjs/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-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "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-ansi-cjs/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/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.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/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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/zip-stream/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" + } + } + } +} diff --git a/articles/websocket-chatbot-js/gatling/javascript/package.json b/articles/websocket-chatbot-js/gatling/javascript/package.json new file mode 100644 index 0000000..fe5df0b --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/package.json @@ -0,0 +1,23 @@ +{ + "name": "gatling-js-demo", + "version": "3.14.306", + "private": true, + "type": "module", + "main": "target/bundle", + "dependencies": { + "@gatling.io/core": "3.14.306", + "@gatling.io/http": "3.14.306" + }, + "devDependencies": { + "@gatling.io/cli": "3.14.306", + "prettier": "3.6.2", + "rimraf": "6.0.1" + }, + "scripts": { + "clean": "rimraf target", + "format": "prettier --write \"**/*.js\"", + "build": "gatling build", + "recorder": "gatling recorder", + "basicSimulation": "gatling run --simulation basicSimulation" + } +} diff --git a/articles/websocket-chatbot-js/gatling/javascript/resources/gatling.conf b/articles/websocket-chatbot-js/gatling/javascript/resources/gatling.conf new file mode 100644 index 0000000..231a337 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/resources/gatling.conf @@ -0,0 +1,103 @@ +######################### +# Gatling Configuration # +######################### + +# This file contains all the settings configurable for Gatling with their default values + +gatling { + core { + #encoding = "utf-8" # Encoding to use throughout Gatling for file and string manipulation + #elFileBodiesCacheMaxCapacity = 200 # Cache size for request body EL templates, set to 0 to disable + #rawFileBodiesCacheMaxCapacity = 200 # Cache size for request body raw files, set to 0 to disable + #rawFileBodiesInMemoryMaxSize = 10240 # Max bite size of raw files to be cached in memory + #pebbleFileBodiesCacheMaxCapacity = 200 # Cache size for request body Pebble templates, set to 0 to disable + #feederAdaptiveLoadModeThreshold = 100 # File size threshold (in MB). Below load eagerly in memory, above use batch mode with default buffer size + #shutdownTimeout = 10000 # Milliseconds to wait for the engine to shutdown + extract { + regex { + #cacheMaxCapacity = 200 # Cache size for the compiled regexes, set to 0 to disable caching + } + xpath { + #cacheMaxCapacity = 200 # Cache size for the compiled XPath queries, set to 0 to disable caching + } + jsonPath { + #cacheMaxCapacity = 200 # Cache size for the compiled jsonPath queries, set to 0 to disable caching + } + css { + #cacheMaxCapacity = 200 # Cache size for the compiled CSS selectors queries, set to 0 to disable caching + } + } + } + socket { + #connectTimeout = 10000 # Timeout in millis for establishing a TCP socket + #tcpNoDelay = true + #soKeepAlive = false # if TCP keepalive configured at OS level should be used + #soReuseAddress = false + } + netty { + #useNativeTransport = true # if Netty Linux native transport should be used instead of Java NIO + #useIoUring = false # if io_uring should be used instead of epoll if available + #allocator = "pooled" # force the ByteBufAllocator, possible values are pooled, unpooled and adaptive + #maxThreadLocalCharBufferSize = 200000 # Netty's default is 16k + } + ssl { + #useOpenSsl = true # if OpenSSL should be used instead of JSSE (only the latter can be debugged with -Djavax.net.debug=ssl) + #useOpenSslFinalizers = false # if OpenSSL contexts should be freed with Finalizer or if using RefCounted is fine + #handshakeTimeout = 10000 # TLS handshake timeout in millis + #useInsecureTrustManager = true # Use an insecure TrustManager that trusts all server certificates + #enabledProtocols = [] # Array of enabled protocols for HTTPS, if empty use Netty's defaults + #enabledCipherSuites = [] # Array of enabled cipher suites for HTTPS, if empty enable all available ciphers + #sessionCacheSize = 0 # SSLSession cache size, set to 0 to use JDK's default + #sessionTimeout = 0 # SSLSession timeout in seconds, set to 0 to use JDK's default (24h) + #enableSni = true # When set to true, enable Server Name indication (SNI) + keyStore { + #type = "" # Type of SSLContext's KeyManagers store, possible values are jks and p12 + #file = "" # Location of SSLContext's KeyManagers store + #password = "" # Password for SSLContext's KeyManagers store + #algorithm = "" # Algorithm used SSLContext's KeyManagers store, typically RSA + } + trustStore { + #type = "" # Type of SSLContext's TrustManagers store, possible values are jks and p12 + #file = "" # Location of SSLContext's TrustManagers store + #password = "" # Password for SSLContext's TrustManagers store + #algorithm = "" # Algorithm used by SSLContext's TrustManagers store, typically RSA + } + } + charting { + #maxPlotPerSeries = 1000 # Number of points per chart in Gatling reports + #useGroupDurationMetric = false # Switch group timings from cumulated response time to group duration. + indicators { + #lowerBound = 800 # Lower bound for the requests' response time to track in the reports and the console summary + #higherBound = 1200 # Higher bound for the requests' response time to track in the reports and the console summary + #percentile1 = 50 # Value for the 1st percentile to track in the reports and the console summary + #percentile2 = 75 # Value for the 2nd percentile to track in the reports and the console summary + #percentile3 = 95 # Value for the 3rd percentile to track in the reports and the console summary + #percentile4 = 99 # Value for the 4th percentile to track in the reports and the console summary + } + } + http { + #fetchedCssCacheMaxCapacity = 200 # Cache size for CSS parsed content, set to 0 to disable + #fetchedHtmlCacheMaxCapacity = 200 # Cache size for HTML parsed content, set to 0 to disable + #perUserCacheMaxCapacity = 200 # Per virtual user cache size, set to 0 to disable + #warmUpUrl = "https://gatling.io" # The URL to use to warm-up the HTTP stack (blank means disabled) + #pooledConnectionIdleTimeout = 60000 # Timeout in millis for a connection to stay idle in the pool + #requestTimeout = 60000 # Timeout in millis for performing an HTTP request + #enableHostnameVerification = false # When set to true, enable hostname verification: SSLEngine#setEndpointIdentificationAlgorithm("HTTPS") + dns { + #queryTimeout = 5000 # Timeout in millis of each DNS query in millis + #maxQueriesPerResolve = 6 # Maximum allowed number of DNS queries for a given name resolution + } + } + jms { + #replyTimeoutScanPeriod = 1000 # scan period for timed out reply messages + } + data { + #writers = [console, file] # The list of DataWriters to which Gatling write simulation data (currently supported : console, file) + #utcDateTime = true # Print date-times with the UTC zone instead of the System's default + console { + #light = false # When set to true, displays a light version without detailed request stats + #writePeriod = 5 # Write interval, in seconds + } + #enableAnalytics = true # Anonymous Usage Analytics (no tracking), please support + } +} diff --git a/articles/websocket-chatbot-js/gatling/javascript/resources/health_insurance_chatbot_questions.csv b/articles/websocket-chatbot-js/gatling/javascript/resources/health_insurance_chatbot_questions.csv new file mode 100644 index 0000000..1c932c3 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/resources/health_insurance_chatbot_questions.csv @@ -0,0 +1,1001 @@ +user_question +Are annual checkups fully covered? +How much is the copay for specialist visits? +What prescription drugs are covered? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +How much is the copay for ER visits? +What is the status of my recent claim? +Is blood test covered under my insurance? +What is the deductible on my plan? +How do I find a doctor in my network? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +What prescription drugs are covered? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I find a doctor in my network? +Where can I find my explanation of benefits? +Where can I find my explanation of benefits? +Is MRI scan covered under my insurance? +Is mental health therapy covered? +How do I update my address or personal info? +How much is the copay for lab work? +What prescription drugs are covered? +How do I file a reimbursement request? +Is blood test covered under my insurance? +What prescription drugs are covered? +How do I update my address or personal info? +What is the status of my recent claim? +What happens if I go to an out-of-network provider? +Is telehealth included in my plan? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +Is mental health therapy covered? +Is physical therapy covered under my insurance? +What are my out-of-pocket maximums? +Does my plan cover urgent care visits? +What does my PPO plan cover? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +What does my HDHP plan cover? +Are annual checkups fully covered? +What are my out-of-pocket maximums? +Is flu shot covered under my insurance? +Where can I find my explanation of benefits? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +Is knee surgery covered under my insurance? +Do I need a referral to see a specialist? +Is blood test covered under my insurance? +How do I access my digital insurance card? +How much is the copay for ER visits? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? +How do I file a reimbursement request? +Is telehealth included in my plan? +Is blood test covered under my insurance? +Is knee surgery covered under my insurance? +How do I appeal a denied claim? +Is MRI scan covered under my insurance? +What is the deductible on my plan? +Is flu shot covered under my insurance? +How do I find a doctor in my network? +What are my out-of-pocket maximums? +Can I add my spouse to my insurance plan? +Do I need a referral to see a specialist? +What is the deductible on my plan? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +What prescription drugs are covered? +How do I access my digital insurance card? +Do I need a referral to see a specialist? +What prescription drugs are covered? +Does my plan cover urgent care visits? +Can I add my spouse to my insurance plan? +How much is the copay for urgent care? +How do I appeal a denied claim? +Is physical therapy covered under my insurance? +How do I access my digital insurance card? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +Does my plan cover urgent care visits? +Does my plan cover urgent care visits? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +Is flu shot covered under my insurance? +What prescription drugs are covered? +Do I need a referral to see a specialist? +How do I access my digital insurance card? +Is mental health therapy covered? +What prescription drugs are covered? +How do I access my digital insurance card? +What does my EPO plan cover? +How do I file a reimbursement request? +Is knee surgery covered under my insurance? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What prescription drugs are covered? +Is MRI scan covered under my insurance? +Can I add my spouse to my insurance plan? +What is the deductible on my plan? +Is blood test covered under my insurance? +Are annual checkups fully covered? +Do I need a referral to see a specialist? +Is physical therapy covered under my insurance? +What is the deductible on my plan? +How do I find a doctor in my network? +What is the deductible on my plan? +What does my HDHP plan cover? +What prescription drugs are covered? +How much is the copay for lab work? +Are annual checkups fully covered? +How do I update my address or personal info? +What is the deductible on my plan? +How do I find a doctor in my network? +How do I appeal a denied claim? +Where can I find my explanation of benefits? +What prescription drugs are covered? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +How do I file a reimbursement request? +Are annual checkups fully covered? +How do I update my address or personal info? +What are my out-of-pocket maximums? +How do I update my address or personal info? +What happens if I go to an out-of-network provider? +How do I file a reimbursement request? +What does my PPO plan cover? +What is the status of my recent claim? +What is the deductible on my plan? +What is the deductible on my plan? +How much is the copay for primary care visits? +How do I find a doctor in my network? +What is the deductible on my plan? +Is telehealth included in my plan? +Is telehealth included in my plan? +Is mental health therapy covered? +What is the deductible on my plan? +Are annual checkups fully covered? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I access my digital insurance card? +What is the status of my recent claim? +How do I update my address or personal info? +What is the status of my recent claim? +Is telehealth included in my plan? +Does my plan cover urgent care visits? +Is blood test covered under my insurance? +How do I access my digital insurance card? +What is the deductible on my plan? +Are annual checkups fully covered? +How much is the copay for ER visits? +Is MRI scan covered under my insurance? +What are my out-of-pocket maximums? +Where can I find my explanation of benefits? +Are annual checkups fully covered? +What does my HMO plan cover? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +What is the status of my recent claim? +What does my PPO plan cover? +How do I appeal a denied claim? +What does my HMO plan cover? +What prescription drugs are covered? +What prescription drugs are covered? +How do I file a reimbursement request? +Do I need a referral to see a specialist? +Is physical therapy covered under my insurance? +Do I need a referral to see a specialist? +Is MRI scan covered under my insurance? +What prescription drugs are covered? +Where can I find my explanation of benefits? +Is blood test covered under my insurance? +What is the deductible on my plan? +Where can I find my explanation of benefits? +Is telehealth included in my plan? +How much is the copay for urgent care? +Is mental health therapy covered? +What is the deductible on my plan? +Are annual checkups fully covered? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +Is telehealth included in my plan? +What does my HDHP plan cover? +How do I file a reimbursement request? +How do I file a reimbursement request? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I appeal a denied claim? +What prescription drugs are covered? +What does my HDHP plan cover? +Is mental health therapy covered? +How do I access my digital insurance card? +What is the status of my recent claim? +What prescription drugs are covered? +How do I file a reimbursement request? +Is telehealth included in my plan? +Is mental health therapy covered? +Is physical therapy covered under my insurance? +Where can I find my explanation of benefits? +Is telehealth included in my plan? +Is MRI scan covered under my insurance? +What does my EPO plan cover? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +How do I file a reimbursement request? +How much is the copay for urgent care? +Can I add my spouse to my insurance plan? +Do I need a referral to see a specialist? +How do I update my address or personal info? +Can I add my spouse to my insurance plan? +What are my out-of-pocket maximums? +Where can I find my explanation of benefits? +How do I appeal a denied claim? +Where can I find my explanation of benefits? +Can I add my spouse to my insurance plan? +How do I update my address or personal info? +What does my HDHP plan cover? +What are my out-of-pocket maximums? +What are my out-of-pocket maximums? +What is the status of my recent claim? +What are my out-of-pocket maximums? +How do I update my address or personal info? +Are annual checkups fully covered? +How do I access my digital insurance card? +Are annual checkups fully covered? +How much is the copay for specialist visits? +Does my plan cover urgent care visits? +Do I need a referral to see a specialist? +What does my HMO plan cover? +How do I access my digital insurance card? +Is mental health therapy covered? +Is mental health therapy covered? +Are annual checkups fully covered? +What are my out-of-pocket maximums? +How do I file a reimbursement request? +Is telehealth included in my plan? +How do I access my digital insurance card? +How do I file a reimbursement request? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +How do I appeal a denied claim? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +Is telehealth included in my plan? +Is MRI scan covered under my insurance? +How do I find a doctor in my network? +How do I appeal a denied claim? +What prescription drugs are covered? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +How do I access my digital insurance card? +What does my EPO plan cover? +Is telehealth included in my plan? +What does my EPO plan cover? +How do I file a reimbursement request? +Is physical therapy covered under my insurance? +How do I find a doctor in my network? +How do I find a doctor in my network? +Do I need a referral to see a specialist? +What is the deductible on my plan? +How much is the copay for specialist visits? +How much is the copay for lab work? +What prescription drugs are covered? +What is the deductible on my plan? +What does my PPO plan cover? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +Is mental health therapy covered? +How do I update my address or personal info? +How do I access my digital insurance card? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +Do I need a referral to see a specialist? +What is the status of my recent claim? +What prescription drugs are covered? +What happens if I go to an out-of-network provider? +Is mental health therapy covered? +Do I need a referral to see a specialist? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +Where can I find my explanation of benefits? +How do I access my digital insurance card? +What is the status of my recent claim? +What is the status of my recent claim? +Is mental health therapy covered? +Is mental health therapy covered? +How do I file a reimbursement request? +How do I find a doctor in my network? +Can I add my spouse to my insurance plan? +Is mental health therapy covered? +Is blood test covered under my insurance? +Where can I find my explanation of benefits? +How do I file a reimbursement request? +Can I add my spouse to my insurance plan? +What is the status of my recent claim? +Do I need a referral to see a specialist? +What is the deductible on my plan? +How much is the copay for lab work? +Is mental health therapy covered? +Is blood test covered under my insurance? +How do I appeal a denied claim? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +Are annual checkups fully covered? +What is the status of my recent claim? +How do I find a doctor in my network? +How do I appeal a denied claim? +What is the deductible on my plan? +How do I file a reimbursement request? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +What does my PPO plan cover? +How do I access my digital insurance card? +Is mental health therapy covered? +Do I need a referral to see a specialist? +How do I update my address or personal info? +How do I appeal a denied claim? +Are annual checkups fully covered? +Are annual checkups fully covered? +Is mental health therapy covered? +Is mental health therapy covered? +What prescription drugs are covered? +Do I need a referral to see a specialist? +How do I file a reimbursement request? +How much is the copay for ER visits? +Is MRI scan covered under my insurance? +How much is the copay for primary care visits? +How do I appeal a denied claim? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +What happens if I go to an out-of-network provider? +What prescription drugs are covered? +Is flu shot covered under my insurance? +How do I find a doctor in my network? +Does my plan cover urgent care visits? +What is the deductible on my plan? +What is the status of my recent claim? +Do I need a referral to see a specialist? +How do I appeal a denied claim? +Is mental health therapy covered? +Is mental health therapy covered? +How do I update my address or personal info? +How do I appeal a denied claim? +How do I file a reimbursement request? +How do I access my digital insurance card? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What is the status of my recent claim? +How do I appeal a denied claim? +Is mental health therapy covered? +What prescription drugs are covered? +Does my plan cover urgent care visits? +How do I update my address or personal info? +How do I appeal a denied claim? +How do I appeal a denied claim? +What prescription drugs are covered? +What are my out-of-pocket maximums? +How do I access my digital insurance card? +Is physical therapy covered under my insurance? +What prescription drugs are covered? +What prescription drugs are covered? +How do I appeal a denied claim? +How do I find a doctor in my network? +Do I need a referral to see a specialist? +What does my PPO plan cover? +How do I update my address or personal info? +What happens if I go to an out-of-network provider? +Are annual checkups fully covered? +What is the status of my recent claim? +How do I access my digital insurance card? +How do I update my address or personal info? +What does my HDHP plan cover? +What does my HDHP plan cover? +Where can I find my explanation of benefits? +What is the deductible on my plan? +How do I appeal a denied claim? +What happens if I go to an out-of-network provider? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +How much is the copay for lab work? +Is blood test covered under my insurance? +What is the deductible on my plan? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +What prescription drugs are covered? +Do I need a referral to see a specialist? +How much is the copay for primary care visits? +What prescription drugs are covered? +Is mental health therapy covered? +How do I access my digital insurance card? +How do I file a reimbursement request? +What is the status of my recent claim? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +What happens if I go to an out-of-network provider? +What are my out-of-pocket maximums? +Is MRI scan covered under my insurance? +What is the deductible on my plan? +What does my EPO plan cover? +What are my out-of-pocket maximums? +What is the status of my recent claim? +Is mental health therapy covered? +Is telehealth included in my plan? +What happens if I go to an out-of-network provider? +How much is the copay for ER visits? +What does my PPO plan cover? +Do I need a referral to see a specialist? +How much is the copay for primary care visits? +Does my plan cover urgent care visits? +How do I find a doctor in my network? +Is knee surgery covered under my insurance? +Is mental health therapy covered? +How do I update my address or personal info? +How do I update my address or personal info? +How much is the copay for primary care visits? +How do I update my address or personal info? +Is mental health therapy covered? +What does my PPO plan cover? +How do I update my address or personal info? +Is mental health therapy covered? +Does my plan cover urgent care visits? +What is the deductible on my plan? +How do I find a doctor in my network? +How much is the copay for urgent care? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +Is mental health therapy covered? +Are annual checkups fully covered? +How do I access my digital insurance card? +What is the status of my recent claim? +How much is the copay for specialist visits? +Do I need a referral to see a specialist? +Is telehealth included in my plan? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +What does my EPO plan cover? +What does my PPO plan cover? +Does my plan cover urgent care visits? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +How do I file a reimbursement request? +How do I access my digital insurance card? +How do I update my address or personal info? +What does my HMO plan cover? +What are my out-of-pocket maximums? +Is mental health therapy covered? +Is telehealth included in my plan? +How do I access my digital insurance card? +Are annual checkups fully covered? +What is the status of my recent claim? +What does my HMO plan cover? +How do I access my digital insurance card? +What does my EPO plan cover? +Are annual checkups fully covered? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +Is mental health therapy covered? +How do I access my digital insurance card? +What happens if I go to an out-of-network provider? +How do I access my digital insurance card? +How much is the copay for urgent care? +How do I update my address or personal info? +What are my out-of-pocket maximums? +How much is the copay for specialist visits? +What is the status of my recent claim? +How do I appeal a denied claim? +How much is the copay for ER visits? +What does my PPO plan cover? +Do I need a referral to see a specialist? +How much is the copay for specialist visits? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What is the deductible on my plan? +What prescription drugs are covered? +Is mental health therapy covered? +What is the status of my recent claim? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +Where can I find my explanation of benefits? +What are my out-of-pocket maximums? +How do I find a doctor in my network? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +How do I file a reimbursement request? +What is the status of my recent claim? +What is the status of my recent claim? +Is telehealth included in my plan? +Is mental health therapy covered? +What are my out-of-pocket maximums? +How do I update my address or personal info? +How do I appeal a denied claim? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +Is flu shot covered under my insurance? +How do I appeal a denied claim? +What happens if I go to an out-of-network provider? +What prescription drugs are covered? +How do I access my digital insurance card? +How do I find a doctor in my network? +Do I need a referral to see a specialist? +How do I appeal a denied claim? +What does my EPO plan cover? +How do I access my digital insurance card? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +Where can I find my explanation of benefits? +Is knee surgery covered under my insurance? +How much is the copay for ER visits? +How do I update my address or personal info? +How do I update my address or personal info? +What is the status of my recent claim? +How do I appeal a denied claim? +How do I file a reimbursement request? +Where can I find my explanation of benefits? +What is the deductible on my plan? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I update my address or personal info? +How do I file a reimbursement request? +What does my HDHP plan cover? +What does my EPO plan cover? +What does my HMO plan cover? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +Is telehealth included in my plan? +Can I add my spouse to my insurance plan? +Are annual checkups fully covered? +What is the deductible on my plan? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +Can I add my spouse to my insurance plan? +What does my HDHP plan cover? +Where can I find my explanation of benefits? +What does my HDHP plan cover? +What are my out-of-pocket maximums? +Is flu shot covered under my insurance? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? +How much is the copay for primary care visits? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +How much is the copay for urgent care? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +What does my PPO plan cover? +How do I appeal a denied claim? +Is mental health therapy covered? +How do I file a reimbursement request? +Does my plan cover urgent care visits? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +How do I update my address or personal info? +What does my EPO plan cover? +How do I update my address or personal info? +What happens if I go to an out-of-network provider? +Is telehealth included in my plan? +How do I file a reimbursement request? +What does my PPO plan cover? +Is telehealth included in my plan? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What does my HDHP plan cover? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +How do I access my digital insurance card? +What is the status of my recent claim? +How do I appeal a denied claim? +What prescription drugs are covered? +How much is the copay for primary care visits? +How do I appeal a denied claim? +Is physical therapy covered under my insurance? +What does my PPO plan cover? +Where can I find my explanation of benefits? +What is the status of my recent claim? +Do I need a referral to see a specialist? +What prescription drugs are covered? +How do I file a reimbursement request? +Can I add my spouse to my insurance plan? +Does my plan cover urgent care visits? +How do I update my address or personal info? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +How do I appeal a denied claim? +What does my HMO plan cover? +What does my HDHP plan cover? +Does my plan cover urgent care visits? +How do I update my address or personal info? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +Where can I find my explanation of benefits? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I appeal a denied claim? +How do I file a reimbursement request? +Is telehealth included in my plan? +Where can I find my explanation of benefits? +Are annual checkups fully covered? +Where can I find my explanation of benefits? +Does my plan cover urgent care visits? +Is telehealth included in my plan? +How do I update my address or personal info? +How do I appeal a denied claim? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +What are my out-of-pocket maximums? +What are my out-of-pocket maximums? +What does my PPO plan cover? +Are annual checkups fully covered? +Do I need a referral to see a specialist? +Can I add my spouse to my insurance plan? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +What prescription drugs are covered? +Is mental health therapy covered? +Is knee surgery covered under my insurance? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What is the deductible on my plan? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +What is the deductible on my plan? +Where can I find my explanation of benefits? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +Can I add my spouse to my insurance plan? +Where can I find my explanation of benefits? +What are my out-of-pocket maximums? +Is mental health therapy covered? +Where can I find my explanation of benefits? +How do I appeal a denied claim? +What is the status of my recent claim? +Is telehealth included in my plan? +Is telehealth included in my plan? +What is the deductible on my plan? +How do I appeal a denied claim? +Does my plan cover urgent care visits? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +What does my PPO plan cover? +What does my EPO plan cover? +What is the status of my recent claim? +How do I update my address or personal info? +What are my out-of-pocket maximums? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +Is physical therapy covered under my insurance? +How do I access my digital insurance card? +What prescription drugs are covered? +How do I access my digital insurance card? +What prescription drugs are covered? +Is mental health therapy covered? +Is mental health therapy covered? +Where can I find my explanation of benefits? +What is the deductible on my plan? +How do I appeal a denied claim? +How much is the copay for urgent care? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +How do I access my digital insurance card? +Is mental health therapy covered? +What does my HDHP plan cover? +How much is the copay for lab work? +What are my out-of-pocket maximums? +How do I find a doctor in my network? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +How much is the copay for primary care visits? +What does my EPO plan cover? +Are annual checkups fully covered? +How much is the copay for ER visits? +What are my out-of-pocket maximums? +How do I access my digital insurance card? +Where can I find my explanation of benefits? +Is blood test covered under my insurance? +How do I update my address or personal info? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +How do I access my digital insurance card? +How much is the copay for lab work? +What are my out-of-pocket maximums? +How do I file a reimbursement request? +Is flu shot covered under my insurance? +Is mental health therapy covered? +How do I find a doctor in my network? +How much is the copay for urgent care? +What is the status of my recent claim? +How do I find a doctor in my network? +How do I find a doctor in my network? +How do I update my address or personal info? +What is the deductible on my plan? +Is mental health therapy covered? +How do I update my address or personal info? +How much is the copay for specialist visits? +Are annual checkups fully covered? +What is the deductible on my plan? +What is the status of my recent claim? +Is blood test covered under my insurance? +Is telehealth included in my plan? +How do I find a doctor in my network? +How do I appeal a denied claim? +What is the deductible on my plan? +How much is the copay for lab work? +Are annual checkups fully covered? +What is the deductible on my plan? +What is the status of my recent claim? +How much is the copay for primary care visits? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I find a doctor in my network? +Can I add my spouse to my insurance plan? +How do I find a doctor in my network? +Does my plan cover urgent care visits? +How much is the copay for primary care visits? +How do I update my address or personal info? +Do I need a referral to see a specialist? +How do I find a doctor in my network? +Is mental health therapy covered? +What does my EPO plan cover? +What does my EPO plan cover? +Is telehealth included in my plan? +How do I find a doctor in my network? +What happens if I go to an out-of-network provider? +Is telehealth included in my plan? +Do I need a referral to see a specialist? +What does my EPO plan cover? +Where can I find my explanation of benefits? +Does my plan cover urgent care visits? +What is the deductible on my plan? +What is the status of my recent claim? +Where can I find my explanation of benefits? +Is knee surgery covered under my insurance? +How do I update my address or personal info? +How do I access my digital insurance card? +How much is the copay for urgent care? +Do I need a referral to see a specialist? +Where can I find my explanation of benefits? +How do I access my digital insurance card? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +What are my out-of-pocket maximums? +Where can I find my explanation of benefits? +What prescription drugs are covered? +What happens if I go to an out-of-network provider? +How do I access my digital insurance card? +Is telehealth included in my plan? +What happens if I go to an out-of-network provider? +Can I add my spouse to my insurance plan? +What happens if I go to an out-of-network provider? +How do I appeal a denied claim? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I update my address or personal info? +What does my EPO plan cover? +What is the status of my recent claim? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +How do I update my address or personal info? +What is the deductible on my plan? +Is knee surgery covered under my insurance? +How do I update my address or personal info? +Are annual checkups fully covered? +What prescription drugs are covered? +Are annual checkups fully covered? +Is mental health therapy covered? +How do I file a reimbursement request? +Where can I find my explanation of benefits? +How much is the copay for ER visits? +Is mental health therapy covered? +How do I access my digital insurance card? +How do I update my address or personal info? +Is telehealth included in my plan? +Where can I find my explanation of benefits? +What is the deductible on my plan? +What is the status of my recent claim? +What are my out-of-pocket maximums? +What does my EPO plan cover? +Is flu shot covered under my insurance? +Where can I find my explanation of benefits? +Does my plan cover urgent care visits? +How do I appeal a denied claim? +Is mental health therapy covered? +What does my HDHP plan cover? +How much is the copay for primary care visits? +How do I file a reimbursement request? +Are annual checkups fully covered? +What is the status of my recent claim? +How do I update my address or personal info? +How do I appeal a denied claim? +Does my plan cover urgent care visits? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +How do I appeal a denied claim? +Is mental health therapy covered? +Does my plan cover urgent care visits? +Does my plan cover urgent care visits? +Is mental health therapy covered? +Are annual checkups fully covered? +Where can I find my explanation of benefits? +What is the status of my recent claim? +Is telehealth included in my plan? +How do I find a doctor in my network? +Are annual checkups fully covered? +How much is the copay for urgent care? +What is the deductible on my plan? +How much is the copay for ER visits? +Is mental health therapy covered? +How much is the copay for lab work? +Is telehealth included in my plan? +Do I need a referral to see a specialist? +How much is the copay for primary care visits? +Is mental health therapy covered? +What prescription drugs are covered? +How do I update my address or personal info? +How do I file a reimbursement request? +How much is the copay for lab work? +What is the deductible on my plan? +How much is the copay for specialist visits? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +What is the status of my recent claim? +How do I file a reimbursement request? +What is the deductible on my plan? +How do I find a doctor in my network? +What is the deductible on my plan? +What happens if I go to an out-of-network provider? +How do I file a reimbursement request? +Can I add my spouse to my insurance plan? +Is telehealth included in my plan? +How do I appeal a denied claim? +Is mental health therapy covered? +Is telehealth included in my plan? +How do I file a reimbursement request? +Does my plan cover urgent care visits? +How much is the copay for lab work? +What does my HMO plan cover? +What prescription drugs are covered? +Can I add my spouse to my insurance plan? +What prescription drugs are covered? +How do I appeal a denied claim? +What is the deductible on my plan? +How much is the copay for primary care visits? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +How much is the copay for primary care visits? +How do I access my digital insurance card? +What is the deductible on my plan? +What prescription drugs are covered? +Are annual checkups fully covered? +How do I update my address or personal info? +What does my EPO plan cover? +What are my out-of-pocket maximums? +Does my plan cover urgent care visits? +What prescription drugs are covered? +How do I appeal a denied claim? +How do I find a doctor in my network? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +Is telehealth included in my plan? +What does my HDHP plan cover? +Can I add my spouse to my insurance plan? +How do I find a doctor in my network? +Are annual checkups fully covered? +How do I update my address or personal info? +What prescription drugs are covered? +What is the status of my recent claim? +Where can I find my explanation of benefits? +How do I appeal a denied claim? +How do I file a reimbursement request? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +What are my out-of-pocket maximums? +Do I need a referral to see a specialist? +Do I need a referral to see a specialist? +Does my plan cover urgent care visits? +How do I update my address or personal info? +What is the status of my recent claim? +Is knee surgery covered under my insurance? +What is the status of my recent claim? +What happens if I go to an out-of-network provider? +How do I find a doctor in my network? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +How much is the copay for lab work? +Is telehealth included in my plan? +How do I file a reimbursement request? +Does my plan cover urgent care visits? +How do I file a reimbursement request? +What is the deductible on my plan? +Can I add my spouse to my insurance plan? +Is flu shot covered under my insurance? +How do I appeal a denied claim? +Is telehealth included in my plan? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +What is the status of my recent claim? +What are my out-of-pocket maximums? +What is the status of my recent claim? +How do I access my digital insurance card? +What does my PPO plan cover? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +How do I file a reimbursement request? +What is the deductible on my plan? +Is knee surgery covered under my insurance? +What prescription drugs are covered? +Can I add my spouse to my insurance plan? +Is knee surgery covered under my insurance? +How do I file a reimbursement request? +Are annual checkups fully covered? +How do I file a reimbursement request? +What prescription drugs are covered? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? +How do I file a reimbursement request? +How do I find a doctor in my network? +Where can I find my explanation of benefits? +What is the deductible on my plan? +What is the status of my recent claim? +How much is the copay for lab work? +How much is the copay for specialist visits? +What is the status of my recent claim? +Where can I find my explanation of benefits? +Is telehealth included in my plan? +Is mental health therapy covered? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +How do I file a reimbursement request? +How do I access my digital insurance card? +How much is the copay for primary care visits? +Are annual checkups fully covered? +How much is the copay for ER visits? +How do I find a doctor in my network? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +What does my HDHP plan cover? +How do I appeal a denied claim? +What happens if I go to an out-of-network provider? +Is knee surgery covered under my insurance? +How do I file a reimbursement request? +What is the deductible on my plan? +Is MRI scan covered under my insurance? +What happens if I go to an out-of-network provider? +What are my out-of-pocket maximums? +Is telehealth included in my plan? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What does my PPO plan cover? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? diff --git a/articles/websocket-chatbot-js/gatling/javascript/resources/logback-test.xml b/articles/websocket-chatbot-js/gatling/javascript/resources/logback-test.xml new file mode 100644 index 0000000..2667f9e --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/resources/logback-test.xml @@ -0,0 +1,19 @@ + + + + + + %d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx + + false + + + + + + + + + + + diff --git a/articles/websocket-chatbot-js/gatling/javascript/src/chatbotSimulation.gatling.js b/articles/websocket-chatbot-js/gatling/javascript/src/chatbotSimulation.gatling.js new file mode 100644 index 0000000..b1e98c6 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/javascript/src/chatbotSimulation.gatling.js @@ -0,0 +1,100 @@ +/** + * Gatling simulation script for load testing a WebSocket-based chatbot application. + * + * @module chatbotSimulation.gatling + */ + +import { + simulation, + constantUsersPerSec, + scenario, + feed, + pause, + exec, + repeat, + regex, + csv, + getParameter, +} from "@gatling.io/core"; +import { http, ws } from "@gatling.io/http"; + +/** + * Main Gatling simulation definition. + */ +export default simulation((setUp) => { + + const baseUrl = getParameter("baseUrl", "http://localhost:3000"); + const wsBaseUrl = getParameter("wsBaseUrl", "ws://localhost:3000"); + const usersPerSec = parseInt(getParameter("usersPerSec", "2")); + const durationSeconds = parseInt(getParameter("durationSeconds", "15")); + const questionsFeeder = csv("resources/health_insurance_chatbot_questions.csv").random(); + const httpProtocol = http + .baseUrl(baseUrl) + .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .doNotTrackHeader("1") + .acceptLanguageHeader("en-US,en;q=0.5") + .acceptEncodingHeader("gzip, deflate") + .userAgentHeader("Gatling2") + .wsBaseUrl(wsBaseUrl); + + /** + * @constant {ScenarioBuilder} scn - Scenario definition for WebSocket interaction. + */ + const scn = scenario("WebSocket") + .exec( + /** + * Sends an HTTP GET request to the home page. + */ + http("Home").get("/"), + pause(1), + /** + * Sets a unique user ID in the session. + * + * @param {Session} session - The Gatling session object. + * @returns {Session} The updated session. + */ + exec((session) => session.set("id", "Gatling" + session.userId())), + + ws("Connect WS").connect("/"), + + pause(1), + /** + * Determines a random number of customer questions for this session. + * + * @param {Session} session - The Gatling session object. + * @returns {Session} The updated session with a random question count. + */ + exec((session) => + session.set("maxQuestions", Math.floor(Math.random() * 10) + 1), + ), + /** + * Repeats sending customer questions and awaiting chatbot responses. + * + * @param {number} i - The iteration index. + */ + repeat((session) => session.get("maxQuestions"), "i").on( + feed(questionsFeeder), + /** + * Sends a user question over WebSocket and awaits a response. + */ + ws("Customer Question") + .sendText((session) => session.get("user_question")) + .await(30).on( + /** + * Checks for a chatbot response message matching any text. + */ + ws.checkTextMessage("Chatbot Response").check(regex("(.*)")), + ), + ), + + pause(1), + + ws("Close WS").close(), + ); + /** + * Sets up the scenario with the specified injection profile and protocol. + */ + setUp( + scn.injectOpen(constantUsersPerSec(usersPerSec).during(durationSeconds)), + ).protocols(httpProtocol); +}); diff --git a/articles/websocket-chatbot-js/gatling/typescript/.gatling/example.package.conf b/articles/websocket-chatbot-js/gatling/typescript/.gatling/example.package.conf new file mode 100644 index 0000000..7f67335 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/.gatling/example.package.conf @@ -0,0 +1,54 @@ +# Learn more about Configuration as Code: https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code +# This file is full deployment configuration file example. +# Please note all these configuration fields, or even this file, are optional. + +gatling.enterprise.package { + # Consistent deployment using an existing package ID + # https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code/#consistent-deployment-with-id + # id = "00000000-0000-0000-0000-000000000000" + name = "My package name" + team = "Default team" # or ID with team = "00000000-0000-0000-0000-000000000000" + default { + simulation { + locations = [ + { + name: "Europe - Paris", + size: 2, + weight: 30 + }, + { + name: "AP Pacific - Mumbai", + size: 2, + weight: 70 + } + ] + parameters { + ignoreDefaults = false + systemProperties { + # System properties names should be surrounded by quotes + # Otherwise, it would be interpreted as HOCON keys + "com.example.prop.1" = "default value from system prop 1" + "com.example.prop.2" = "default value from system prop 2" + } + environmentVariables { + MY_SIMULATION_ENV_VAR_1 = "default value from environment 1" + MY_SIMULATION_ENV_VAR_2 = "default value from environment 2" + } + } + timeWindow { + rampUp = 10 # in seconds + rampDown = 10 # in seconds + } + } + } + simulations = [ + { + # Consistent deployment using an existing simulation ID + # https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code/#consistent-deployment-with-id + # id = "00000000-0000-0000-0000-000000000001" + name = "My simulation name" + # Name of the simulation (i.e.: prefix of the simulation file src/*.gatling.ts) + simulation = "basicSimulation" + } + ] +} diff --git a/articles/websocket-chatbot-js/gatling/typescript/.gatling/package.conf b/articles/websocket-chatbot-js/gatling/typescript/.gatling/package.conf new file mode 100644 index 0000000..f095688 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/.gatling/package.conf @@ -0,0 +1,2 @@ +# See `example.package.conf` for a full deployment configuration file example +# Learn more about Configuration as Code: https://docs.gatling.io/reference/execute/cloud/user/configuration-as-code diff --git a/articles/websocket-chatbot-js/gatling/typescript/.prettierignore b/articles/websocket-chatbot-js/gatling/typescript/.prettierignore new file mode 100644 index 0000000..aa8afe6 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/.prettierignore @@ -0,0 +1,2 @@ +node_modules/ +target/ diff --git a/articles/websocket-chatbot-js/gatling/typescript/.prettierrc b/articles/websocket-chatbot-js/gatling/typescript/.prettierrc new file mode 100644 index 0000000..0660e84 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/.prettierrc @@ -0,0 +1,16 @@ +{ + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "always", + "requirePragma": false, + "endOfLine": "lf", + "embeddedLanguageFormatting": "auto" +} diff --git a/articles/websocket-chatbot-js/gatling/typescript/package-lock.json b/articles/websocket-chatbot-js/gatling/typescript/package-lock.json new file mode 100644 index 0000000..bfd286a --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/package-lock.json @@ -0,0 +1,2463 @@ +{ + "name": "gatling-ts-demo", + "version": "3.14.306", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gatling-ts-demo", + "version": "3.14.306", + "dependencies": { + "@gatling.io/core": "3.14.306", + "@gatling.io/http": "3.14.306" + }, + "devDependencies": { + "@gatling.io/cli": "3.14.306", + "prettier": "3.6.2", + "rimraf": "6.0.1", + "typescript": "5.8.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", + "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", + "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", + "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", + "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", + "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", + "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", + "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", + "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", + "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", + "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", + "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", + "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", + "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", + "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", + "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", + "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", + "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", + "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", + "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", + "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", + "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", + "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", + "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", + "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", + "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", + "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@gatling.io/cli": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/cli/-/cli-3.14.306.tgz", + "integrity": "sha512-CZgBabeKFMhVCFTmwBkle4r0O1uW+NZFzm/dRuPTtdoPNO/0+W2I7u9/Df5XXMo5bdvpAMu3/cKXAPGVVzEXTw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jspm/core": "2.1.0", + "archiver": "7.0.1", + "commander": "14.0.0", + "esbuild": "0.25.6", + "esbuild-plugin-tsc": "0.5.0", + "import-meta-resolve": "4.1.0", + "make-fetch-happen": "14.0.3", + "node-stream-zip": "1.15.0", + "readline-sync": "1.4.10" + }, + "bin": { + "gatling": "target/index.js" + } + }, + "node_modules/@gatling.io/core": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/core/-/core-3.14.306.tgz", + "integrity": "sha512-YJQCcn0DkXmbY2ZDkFb1qP55uqm87LHBuNPPLL1iXbFWVFh/liG9onf1JU5s/e4lefEhBjARmlZG2buHoFVSVQ==", + "license": "Apache-2.0", + "dependencies": { + "@gatling.io/jvm-types": "3.14.306" + } + }, + "node_modules/@gatling.io/http": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/http/-/http-3.14.306.tgz", + "integrity": "sha512-GOjBO5A4Uq3Th4rpcoVW+eY4fJo/EyutAvCwLOAXuxDQvVvYaqK7POMQ7z+aQ3CaKKnGtaynmNU4sFoqukBfgQ==", + "license": "Apache-2.0", + "dependencies": { + "@gatling.io/core": "3.14.306", + "@gatling.io/jvm-types": "3.14.306" + } + }, + "node_modules/@gatling.io/jvm-types": { + "version": "3.14.306", + "resolved": "https://registry.npmjs.org/@gatling.io/jvm-types/-/jvm-types-3.14.306.tgz", + "integrity": "sha512-6X3oTWRRTid6E+oiIyjLPvaM27zOeLfbqptglx7O72JO91ufqdssMSmizeo4Dsdr+t5elZahF7YUQEGgtTKX5Q==", + "license": "Apache-2.0" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jspm/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.1.0.tgz", + "integrity": "sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/archiver-utils/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/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/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/archiver/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/archiver/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/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/archiver/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "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/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "dev": true, + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "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/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/compress-commons/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/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/compress-commons/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/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/crc32-stream/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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", + "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.6", + "@esbuild/android-arm": "0.25.6", + "@esbuild/android-arm64": "0.25.6", + "@esbuild/android-x64": "0.25.6", + "@esbuild/darwin-arm64": "0.25.6", + "@esbuild/darwin-x64": "0.25.6", + "@esbuild/freebsd-arm64": "0.25.6", + "@esbuild/freebsd-x64": "0.25.6", + "@esbuild/linux-arm": "0.25.6", + "@esbuild/linux-arm64": "0.25.6", + "@esbuild/linux-ia32": "0.25.6", + "@esbuild/linux-loong64": "0.25.6", + "@esbuild/linux-mips64el": "0.25.6", + "@esbuild/linux-ppc64": "0.25.6", + "@esbuild/linux-riscv64": "0.25.6", + "@esbuild/linux-s390x": "0.25.6", + "@esbuild/linux-x64": "0.25.6", + "@esbuild/netbsd-arm64": "0.25.6", + "@esbuild/netbsd-x64": "0.25.6", + "@esbuild/openbsd-arm64": "0.25.6", + "@esbuild/openbsd-x64": "0.25.6", + "@esbuild/openharmony-arm64": "0.25.6", + "@esbuild/sunos-x64": "0.25.6", + "@esbuild/win32-arm64": "0.25.6", + "@esbuild/win32-ia32": "0.25.6", + "@esbuild/win32-x64": "0.25.6" + } + }, + "node_modules/esbuild-plugin-tsc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-tsc/-/esbuild-plugin-tsc-0.5.0.tgz", + "integrity": "sha512-t9j90NnMhAGWzS0SKX3zNa/XeWcUanqKaFe36CSmXiB2nYFdaSzKY9pBZTvGV7NGImxE1BktOOlVpQyYnUTVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-comments": "^2.0.1" + }, + "peerDependencies": { + "typescript": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "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/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/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "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/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", + "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/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/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/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/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/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/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "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/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.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-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "optional": true + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "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/string-width-cjs/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/string-width-cjs/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/string-width-cjs/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-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "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-ansi-cjs/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/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.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/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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/zip-stream/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" + } + } + } +} diff --git a/articles/websocket-chatbot-js/gatling/typescript/package.json b/articles/websocket-chatbot-js/gatling/typescript/package.json new file mode 100644 index 0000000..086a6a9 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/package.json @@ -0,0 +1,25 @@ +{ + "name": "gatling-ts-demo", + "version": "3.14.306", + "private": true, + "type": "module", + "main": "target/bundle", + "dependencies": { + "@gatling.io/core": "3.14.306", + "@gatling.io/http": "3.14.306" + }, + "devDependencies": { + "@gatling.io/cli": "3.14.306", + "prettier": "3.6.2", + "rimraf": "6.0.1", + "typescript": "5.8.3" + }, + "scripts": { + "clean": "rimraf target", + "format": "prettier --write \"**/*.ts\"", + "check": "tsc --noEmit", + "build": "tsc --noEmit && gatling build --typescript", + "recorder": "gatling recorder --typescript", + "basicSimulation": "tsc --noEmit && gatling run --typescript --simulation basicSimulation" + } +} diff --git a/articles/websocket-chatbot-js/gatling/typescript/resources/gatling.conf b/articles/websocket-chatbot-js/gatling/typescript/resources/gatling.conf new file mode 100644 index 0000000..231a337 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/resources/gatling.conf @@ -0,0 +1,103 @@ +######################### +# Gatling Configuration # +######################### + +# This file contains all the settings configurable for Gatling with their default values + +gatling { + core { + #encoding = "utf-8" # Encoding to use throughout Gatling for file and string manipulation + #elFileBodiesCacheMaxCapacity = 200 # Cache size for request body EL templates, set to 0 to disable + #rawFileBodiesCacheMaxCapacity = 200 # Cache size for request body raw files, set to 0 to disable + #rawFileBodiesInMemoryMaxSize = 10240 # Max bite size of raw files to be cached in memory + #pebbleFileBodiesCacheMaxCapacity = 200 # Cache size for request body Pebble templates, set to 0 to disable + #feederAdaptiveLoadModeThreshold = 100 # File size threshold (in MB). Below load eagerly in memory, above use batch mode with default buffer size + #shutdownTimeout = 10000 # Milliseconds to wait for the engine to shutdown + extract { + regex { + #cacheMaxCapacity = 200 # Cache size for the compiled regexes, set to 0 to disable caching + } + xpath { + #cacheMaxCapacity = 200 # Cache size for the compiled XPath queries, set to 0 to disable caching + } + jsonPath { + #cacheMaxCapacity = 200 # Cache size for the compiled jsonPath queries, set to 0 to disable caching + } + css { + #cacheMaxCapacity = 200 # Cache size for the compiled CSS selectors queries, set to 0 to disable caching + } + } + } + socket { + #connectTimeout = 10000 # Timeout in millis for establishing a TCP socket + #tcpNoDelay = true + #soKeepAlive = false # if TCP keepalive configured at OS level should be used + #soReuseAddress = false + } + netty { + #useNativeTransport = true # if Netty Linux native transport should be used instead of Java NIO + #useIoUring = false # if io_uring should be used instead of epoll if available + #allocator = "pooled" # force the ByteBufAllocator, possible values are pooled, unpooled and adaptive + #maxThreadLocalCharBufferSize = 200000 # Netty's default is 16k + } + ssl { + #useOpenSsl = true # if OpenSSL should be used instead of JSSE (only the latter can be debugged with -Djavax.net.debug=ssl) + #useOpenSslFinalizers = false # if OpenSSL contexts should be freed with Finalizer or if using RefCounted is fine + #handshakeTimeout = 10000 # TLS handshake timeout in millis + #useInsecureTrustManager = true # Use an insecure TrustManager that trusts all server certificates + #enabledProtocols = [] # Array of enabled protocols for HTTPS, if empty use Netty's defaults + #enabledCipherSuites = [] # Array of enabled cipher suites for HTTPS, if empty enable all available ciphers + #sessionCacheSize = 0 # SSLSession cache size, set to 0 to use JDK's default + #sessionTimeout = 0 # SSLSession timeout in seconds, set to 0 to use JDK's default (24h) + #enableSni = true # When set to true, enable Server Name indication (SNI) + keyStore { + #type = "" # Type of SSLContext's KeyManagers store, possible values are jks and p12 + #file = "" # Location of SSLContext's KeyManagers store + #password = "" # Password for SSLContext's KeyManagers store + #algorithm = "" # Algorithm used SSLContext's KeyManagers store, typically RSA + } + trustStore { + #type = "" # Type of SSLContext's TrustManagers store, possible values are jks and p12 + #file = "" # Location of SSLContext's TrustManagers store + #password = "" # Password for SSLContext's TrustManagers store + #algorithm = "" # Algorithm used by SSLContext's TrustManagers store, typically RSA + } + } + charting { + #maxPlotPerSeries = 1000 # Number of points per chart in Gatling reports + #useGroupDurationMetric = false # Switch group timings from cumulated response time to group duration. + indicators { + #lowerBound = 800 # Lower bound for the requests' response time to track in the reports and the console summary + #higherBound = 1200 # Higher bound for the requests' response time to track in the reports and the console summary + #percentile1 = 50 # Value for the 1st percentile to track in the reports and the console summary + #percentile2 = 75 # Value for the 2nd percentile to track in the reports and the console summary + #percentile3 = 95 # Value for the 3rd percentile to track in the reports and the console summary + #percentile4 = 99 # Value for the 4th percentile to track in the reports and the console summary + } + } + http { + #fetchedCssCacheMaxCapacity = 200 # Cache size for CSS parsed content, set to 0 to disable + #fetchedHtmlCacheMaxCapacity = 200 # Cache size for HTML parsed content, set to 0 to disable + #perUserCacheMaxCapacity = 200 # Per virtual user cache size, set to 0 to disable + #warmUpUrl = "https://gatling.io" # The URL to use to warm-up the HTTP stack (blank means disabled) + #pooledConnectionIdleTimeout = 60000 # Timeout in millis for a connection to stay idle in the pool + #requestTimeout = 60000 # Timeout in millis for performing an HTTP request + #enableHostnameVerification = false # When set to true, enable hostname verification: SSLEngine#setEndpointIdentificationAlgorithm("HTTPS") + dns { + #queryTimeout = 5000 # Timeout in millis of each DNS query in millis + #maxQueriesPerResolve = 6 # Maximum allowed number of DNS queries for a given name resolution + } + } + jms { + #replyTimeoutScanPeriod = 1000 # scan period for timed out reply messages + } + data { + #writers = [console, file] # The list of DataWriters to which Gatling write simulation data (currently supported : console, file) + #utcDateTime = true # Print date-times with the UTC zone instead of the System's default + console { + #light = false # When set to true, displays a light version without detailed request stats + #writePeriod = 5 # Write interval, in seconds + } + #enableAnalytics = true # Anonymous Usage Analytics (no tracking), please support + } +} diff --git a/articles/websocket-chatbot-js/gatling/typescript/resources/health_insurance_chatbot_questions.csv b/articles/websocket-chatbot-js/gatling/typescript/resources/health_insurance_chatbot_questions.csv new file mode 100644 index 0000000..1c932c3 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/resources/health_insurance_chatbot_questions.csv @@ -0,0 +1,1001 @@ +user_question +Are annual checkups fully covered? +How much is the copay for specialist visits? +What prescription drugs are covered? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +How much is the copay for ER visits? +What is the status of my recent claim? +Is blood test covered under my insurance? +What is the deductible on my plan? +How do I find a doctor in my network? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +What prescription drugs are covered? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I find a doctor in my network? +Where can I find my explanation of benefits? +Where can I find my explanation of benefits? +Is MRI scan covered under my insurance? +Is mental health therapy covered? +How do I update my address or personal info? +How much is the copay for lab work? +What prescription drugs are covered? +How do I file a reimbursement request? +Is blood test covered under my insurance? +What prescription drugs are covered? +How do I update my address or personal info? +What is the status of my recent claim? +What happens if I go to an out-of-network provider? +Is telehealth included in my plan? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +Is mental health therapy covered? +Is physical therapy covered under my insurance? +What are my out-of-pocket maximums? +Does my plan cover urgent care visits? +What does my PPO plan cover? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +What does my HDHP plan cover? +Are annual checkups fully covered? +What are my out-of-pocket maximums? +Is flu shot covered under my insurance? +Where can I find my explanation of benefits? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +Is knee surgery covered under my insurance? +Do I need a referral to see a specialist? +Is blood test covered under my insurance? +How do I access my digital insurance card? +How much is the copay for ER visits? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? +How do I file a reimbursement request? +Is telehealth included in my plan? +Is blood test covered under my insurance? +Is knee surgery covered under my insurance? +How do I appeal a denied claim? +Is MRI scan covered under my insurance? +What is the deductible on my plan? +Is flu shot covered under my insurance? +How do I find a doctor in my network? +What are my out-of-pocket maximums? +Can I add my spouse to my insurance plan? +Do I need a referral to see a specialist? +What is the deductible on my plan? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +What prescription drugs are covered? +How do I access my digital insurance card? +Do I need a referral to see a specialist? +What prescription drugs are covered? +Does my plan cover urgent care visits? +Can I add my spouse to my insurance plan? +How much is the copay for urgent care? +How do I appeal a denied claim? +Is physical therapy covered under my insurance? +How do I access my digital insurance card? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +Does my plan cover urgent care visits? +Does my plan cover urgent care visits? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +Is flu shot covered under my insurance? +What prescription drugs are covered? +Do I need a referral to see a specialist? +How do I access my digital insurance card? +Is mental health therapy covered? +What prescription drugs are covered? +How do I access my digital insurance card? +What does my EPO plan cover? +How do I file a reimbursement request? +Is knee surgery covered under my insurance? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What prescription drugs are covered? +Is MRI scan covered under my insurance? +Can I add my spouse to my insurance plan? +What is the deductible on my plan? +Is blood test covered under my insurance? +Are annual checkups fully covered? +Do I need a referral to see a specialist? +Is physical therapy covered under my insurance? +What is the deductible on my plan? +How do I find a doctor in my network? +What is the deductible on my plan? +What does my HDHP plan cover? +What prescription drugs are covered? +How much is the copay for lab work? +Are annual checkups fully covered? +How do I update my address or personal info? +What is the deductible on my plan? +How do I find a doctor in my network? +How do I appeal a denied claim? +Where can I find my explanation of benefits? +What prescription drugs are covered? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +How do I file a reimbursement request? +Are annual checkups fully covered? +How do I update my address or personal info? +What are my out-of-pocket maximums? +How do I update my address or personal info? +What happens if I go to an out-of-network provider? +How do I file a reimbursement request? +What does my PPO plan cover? +What is the status of my recent claim? +What is the deductible on my plan? +What is the deductible on my plan? +How much is the copay for primary care visits? +How do I find a doctor in my network? +What is the deductible on my plan? +Is telehealth included in my plan? +Is telehealth included in my plan? +Is mental health therapy covered? +What is the deductible on my plan? +Are annual checkups fully covered? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I access my digital insurance card? +What is the status of my recent claim? +How do I update my address or personal info? +What is the status of my recent claim? +Is telehealth included in my plan? +Does my plan cover urgent care visits? +Is blood test covered under my insurance? +How do I access my digital insurance card? +What is the deductible on my plan? +Are annual checkups fully covered? +How much is the copay for ER visits? +Is MRI scan covered under my insurance? +What are my out-of-pocket maximums? +Where can I find my explanation of benefits? +Are annual checkups fully covered? +What does my HMO plan cover? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +What is the status of my recent claim? +What does my PPO plan cover? +How do I appeal a denied claim? +What does my HMO plan cover? +What prescription drugs are covered? +What prescription drugs are covered? +How do I file a reimbursement request? +Do I need a referral to see a specialist? +Is physical therapy covered under my insurance? +Do I need a referral to see a specialist? +Is MRI scan covered under my insurance? +What prescription drugs are covered? +Where can I find my explanation of benefits? +Is blood test covered under my insurance? +What is the deductible on my plan? +Where can I find my explanation of benefits? +Is telehealth included in my plan? +How much is the copay for urgent care? +Is mental health therapy covered? +What is the deductible on my plan? +Are annual checkups fully covered? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +Is telehealth included in my plan? +What does my HDHP plan cover? +How do I file a reimbursement request? +How do I file a reimbursement request? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I appeal a denied claim? +What prescription drugs are covered? +What does my HDHP plan cover? +Is mental health therapy covered? +How do I access my digital insurance card? +What is the status of my recent claim? +What prescription drugs are covered? +How do I file a reimbursement request? +Is telehealth included in my plan? +Is mental health therapy covered? +Is physical therapy covered under my insurance? +Where can I find my explanation of benefits? +Is telehealth included in my plan? +Is MRI scan covered under my insurance? +What does my EPO plan cover? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +How do I file a reimbursement request? +How much is the copay for urgent care? +Can I add my spouse to my insurance plan? +Do I need a referral to see a specialist? +How do I update my address or personal info? +Can I add my spouse to my insurance plan? +What are my out-of-pocket maximums? +Where can I find my explanation of benefits? +How do I appeal a denied claim? +Where can I find my explanation of benefits? +Can I add my spouse to my insurance plan? +How do I update my address or personal info? +What does my HDHP plan cover? +What are my out-of-pocket maximums? +What are my out-of-pocket maximums? +What is the status of my recent claim? +What are my out-of-pocket maximums? +How do I update my address or personal info? +Are annual checkups fully covered? +How do I access my digital insurance card? +Are annual checkups fully covered? +How much is the copay for specialist visits? +Does my plan cover urgent care visits? +Do I need a referral to see a specialist? +What does my HMO plan cover? +How do I access my digital insurance card? +Is mental health therapy covered? +Is mental health therapy covered? +Are annual checkups fully covered? +What are my out-of-pocket maximums? +How do I file a reimbursement request? +Is telehealth included in my plan? +How do I access my digital insurance card? +How do I file a reimbursement request? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +How do I appeal a denied claim? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +Is telehealth included in my plan? +Is MRI scan covered under my insurance? +How do I find a doctor in my network? +How do I appeal a denied claim? +What prescription drugs are covered? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +How do I access my digital insurance card? +What does my EPO plan cover? +Is telehealth included in my plan? +What does my EPO plan cover? +How do I file a reimbursement request? +Is physical therapy covered under my insurance? +How do I find a doctor in my network? +How do I find a doctor in my network? +Do I need a referral to see a specialist? +What is the deductible on my plan? +How much is the copay for specialist visits? +How much is the copay for lab work? +What prescription drugs are covered? +What is the deductible on my plan? +What does my PPO plan cover? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +Is mental health therapy covered? +How do I update my address or personal info? +How do I access my digital insurance card? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +Do I need a referral to see a specialist? +What is the status of my recent claim? +What prescription drugs are covered? +What happens if I go to an out-of-network provider? +Is mental health therapy covered? +Do I need a referral to see a specialist? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +Where can I find my explanation of benefits? +How do I access my digital insurance card? +What is the status of my recent claim? +What is the status of my recent claim? +Is mental health therapy covered? +Is mental health therapy covered? +How do I file a reimbursement request? +How do I find a doctor in my network? +Can I add my spouse to my insurance plan? +Is mental health therapy covered? +Is blood test covered under my insurance? +Where can I find my explanation of benefits? +How do I file a reimbursement request? +Can I add my spouse to my insurance plan? +What is the status of my recent claim? +Do I need a referral to see a specialist? +What is the deductible on my plan? +How much is the copay for lab work? +Is mental health therapy covered? +Is blood test covered under my insurance? +How do I appeal a denied claim? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +Are annual checkups fully covered? +What is the status of my recent claim? +How do I find a doctor in my network? +How do I appeal a denied claim? +What is the deductible on my plan? +How do I file a reimbursement request? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +What does my PPO plan cover? +How do I access my digital insurance card? +Is mental health therapy covered? +Do I need a referral to see a specialist? +How do I update my address or personal info? +How do I appeal a denied claim? +Are annual checkups fully covered? +Are annual checkups fully covered? +Is mental health therapy covered? +Is mental health therapy covered? +What prescription drugs are covered? +Do I need a referral to see a specialist? +How do I file a reimbursement request? +How much is the copay for ER visits? +Is MRI scan covered under my insurance? +How much is the copay for primary care visits? +How do I appeal a denied claim? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +What happens if I go to an out-of-network provider? +What prescription drugs are covered? +Is flu shot covered under my insurance? +How do I find a doctor in my network? +Does my plan cover urgent care visits? +What is the deductible on my plan? +What is the status of my recent claim? +Do I need a referral to see a specialist? +How do I appeal a denied claim? +Is mental health therapy covered? +Is mental health therapy covered? +How do I update my address or personal info? +How do I appeal a denied claim? +How do I file a reimbursement request? +How do I access my digital insurance card? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What is the status of my recent claim? +How do I appeal a denied claim? +Is mental health therapy covered? +What prescription drugs are covered? +Does my plan cover urgent care visits? +How do I update my address or personal info? +How do I appeal a denied claim? +How do I appeal a denied claim? +What prescription drugs are covered? +What are my out-of-pocket maximums? +How do I access my digital insurance card? +Is physical therapy covered under my insurance? +What prescription drugs are covered? +What prescription drugs are covered? +How do I appeal a denied claim? +How do I find a doctor in my network? +Do I need a referral to see a specialist? +What does my PPO plan cover? +How do I update my address or personal info? +What happens if I go to an out-of-network provider? +Are annual checkups fully covered? +What is the status of my recent claim? +How do I access my digital insurance card? +How do I update my address or personal info? +What does my HDHP plan cover? +What does my HDHP plan cover? +Where can I find my explanation of benefits? +What is the deductible on my plan? +How do I appeal a denied claim? +What happens if I go to an out-of-network provider? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +How much is the copay for lab work? +Is blood test covered under my insurance? +What is the deductible on my plan? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +What prescription drugs are covered? +Do I need a referral to see a specialist? +How much is the copay for primary care visits? +What prescription drugs are covered? +Is mental health therapy covered? +How do I access my digital insurance card? +How do I file a reimbursement request? +What is the status of my recent claim? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +What happens if I go to an out-of-network provider? +What are my out-of-pocket maximums? +Is MRI scan covered under my insurance? +What is the deductible on my plan? +What does my EPO plan cover? +What are my out-of-pocket maximums? +What is the status of my recent claim? +Is mental health therapy covered? +Is telehealth included in my plan? +What happens if I go to an out-of-network provider? +How much is the copay for ER visits? +What does my PPO plan cover? +Do I need a referral to see a specialist? +How much is the copay for primary care visits? +Does my plan cover urgent care visits? +How do I find a doctor in my network? +Is knee surgery covered under my insurance? +Is mental health therapy covered? +How do I update my address or personal info? +How do I update my address or personal info? +How much is the copay for primary care visits? +How do I update my address or personal info? +Is mental health therapy covered? +What does my PPO plan cover? +How do I update my address or personal info? +Is mental health therapy covered? +Does my plan cover urgent care visits? +What is the deductible on my plan? +How do I find a doctor in my network? +How much is the copay for urgent care? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +Is mental health therapy covered? +Are annual checkups fully covered? +How do I access my digital insurance card? +What is the status of my recent claim? +How much is the copay for specialist visits? +Do I need a referral to see a specialist? +Is telehealth included in my plan? +What are my out-of-pocket maximums? +What happens if I go to an out-of-network provider? +What does my EPO plan cover? +What does my PPO plan cover? +Does my plan cover urgent care visits? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +How do I file a reimbursement request? +How do I access my digital insurance card? +How do I update my address or personal info? +What does my HMO plan cover? +What are my out-of-pocket maximums? +Is mental health therapy covered? +Is telehealth included in my plan? +How do I access my digital insurance card? +Are annual checkups fully covered? +What is the status of my recent claim? +What does my HMO plan cover? +How do I access my digital insurance card? +What does my EPO plan cover? +Are annual checkups fully covered? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +Is mental health therapy covered? +How do I access my digital insurance card? +What happens if I go to an out-of-network provider? +How do I access my digital insurance card? +How much is the copay for urgent care? +How do I update my address or personal info? +What are my out-of-pocket maximums? +How much is the copay for specialist visits? +What is the status of my recent claim? +How do I appeal a denied claim? +How much is the copay for ER visits? +What does my PPO plan cover? +Do I need a referral to see a specialist? +How much is the copay for specialist visits? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What is the deductible on my plan? +What prescription drugs are covered? +Is mental health therapy covered? +What is the status of my recent claim? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +Do I need a referral to see a specialist? +Where can I find my explanation of benefits? +What are my out-of-pocket maximums? +How do I find a doctor in my network? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +How do I file a reimbursement request? +What is the status of my recent claim? +What is the status of my recent claim? +Is telehealth included in my plan? +Is mental health therapy covered? +What are my out-of-pocket maximums? +How do I update my address or personal info? +How do I appeal a denied claim? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +Is flu shot covered under my insurance? +How do I appeal a denied claim? +What happens if I go to an out-of-network provider? +What prescription drugs are covered? +How do I access my digital insurance card? +How do I find a doctor in my network? +Do I need a referral to see a specialist? +How do I appeal a denied claim? +What does my EPO plan cover? +How do I access my digital insurance card? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +Where can I find my explanation of benefits? +Is knee surgery covered under my insurance? +How much is the copay for ER visits? +How do I update my address or personal info? +How do I update my address or personal info? +What is the status of my recent claim? +How do I appeal a denied claim? +How do I file a reimbursement request? +Where can I find my explanation of benefits? +What is the deductible on my plan? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I update my address or personal info? +How do I file a reimbursement request? +What does my HDHP plan cover? +What does my EPO plan cover? +What does my HMO plan cover? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +Is telehealth included in my plan? +Can I add my spouse to my insurance plan? +Are annual checkups fully covered? +What is the deductible on my plan? +Do I need a referral to see a specialist? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +Can I add my spouse to my insurance plan? +What does my HDHP plan cover? +Where can I find my explanation of benefits? +What does my HDHP plan cover? +What are my out-of-pocket maximums? +Is flu shot covered under my insurance? +What is the status of my recent claim? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? +How much is the copay for primary care visits? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +How much is the copay for urgent care? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +What does my PPO plan cover? +How do I appeal a denied claim? +Is mental health therapy covered? +How do I file a reimbursement request? +Does my plan cover urgent care visits? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +How do I update my address or personal info? +What does my EPO plan cover? +How do I update my address or personal info? +What happens if I go to an out-of-network provider? +Is telehealth included in my plan? +How do I file a reimbursement request? +What does my PPO plan cover? +Is telehealth included in my plan? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What does my HDHP plan cover? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +How do I access my digital insurance card? +What is the status of my recent claim? +How do I appeal a denied claim? +What prescription drugs are covered? +How much is the copay for primary care visits? +How do I appeal a denied claim? +Is physical therapy covered under my insurance? +What does my PPO plan cover? +Where can I find my explanation of benefits? +What is the status of my recent claim? +Do I need a referral to see a specialist? +What prescription drugs are covered? +How do I file a reimbursement request? +Can I add my spouse to my insurance plan? +Does my plan cover urgent care visits? +How do I update my address or personal info? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +How do I appeal a denied claim? +What does my HMO plan cover? +What does my HDHP plan cover? +Does my plan cover urgent care visits? +How do I update my address or personal info? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +Where can I find my explanation of benefits? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I appeal a denied claim? +How do I file a reimbursement request? +Is telehealth included in my plan? +Where can I find my explanation of benefits? +Are annual checkups fully covered? +Where can I find my explanation of benefits? +Does my plan cover urgent care visits? +Is telehealth included in my plan? +How do I update my address or personal info? +How do I appeal a denied claim? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +What are my out-of-pocket maximums? +What are my out-of-pocket maximums? +What does my PPO plan cover? +Are annual checkups fully covered? +Do I need a referral to see a specialist? +Can I add my spouse to my insurance plan? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +What prescription drugs are covered? +Is mental health therapy covered? +Is knee surgery covered under my insurance? +Where can I find my explanation of benefits? +What is the status of my recent claim? +What is the deductible on my plan? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +What is the deductible on my plan? +Where can I find my explanation of benefits? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +Can I add my spouse to my insurance plan? +Where can I find my explanation of benefits? +What are my out-of-pocket maximums? +Is mental health therapy covered? +Where can I find my explanation of benefits? +How do I appeal a denied claim? +What is the status of my recent claim? +Is telehealth included in my plan? +Is telehealth included in my plan? +What is the deductible on my plan? +How do I appeal a denied claim? +Does my plan cover urgent care visits? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +What does my PPO plan cover? +What does my EPO plan cover? +What is the status of my recent claim? +How do I update my address or personal info? +What are my out-of-pocket maximums? +Do I need a referral to see a specialist? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +Is physical therapy covered under my insurance? +How do I access my digital insurance card? +What prescription drugs are covered? +How do I access my digital insurance card? +What prescription drugs are covered? +Is mental health therapy covered? +Is mental health therapy covered? +Where can I find my explanation of benefits? +What is the deductible on my plan? +How do I appeal a denied claim? +How much is the copay for urgent care? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +How do I access my digital insurance card? +Is mental health therapy covered? +What does my HDHP plan cover? +How much is the copay for lab work? +What are my out-of-pocket maximums? +How do I find a doctor in my network? +What happens if I go to an out-of-network provider? +How do I update my address or personal info? +How much is the copay for primary care visits? +What does my EPO plan cover? +Are annual checkups fully covered? +How much is the copay for ER visits? +What are my out-of-pocket maximums? +How do I access my digital insurance card? +Where can I find my explanation of benefits? +Is blood test covered under my insurance? +How do I update my address or personal info? +Where can I find my explanation of benefits? +Do I need a referral to see a specialist? +How do I access my digital insurance card? +How much is the copay for lab work? +What are my out-of-pocket maximums? +How do I file a reimbursement request? +Is flu shot covered under my insurance? +Is mental health therapy covered? +How do I find a doctor in my network? +How much is the copay for urgent care? +What is the status of my recent claim? +How do I find a doctor in my network? +How do I find a doctor in my network? +How do I update my address or personal info? +What is the deductible on my plan? +Is mental health therapy covered? +How do I update my address or personal info? +How much is the copay for specialist visits? +Are annual checkups fully covered? +What is the deductible on my plan? +What is the status of my recent claim? +Is blood test covered under my insurance? +Is telehealth included in my plan? +How do I find a doctor in my network? +How do I appeal a denied claim? +What is the deductible on my plan? +How much is the copay for lab work? +Are annual checkups fully covered? +What is the deductible on my plan? +What is the status of my recent claim? +How much is the copay for primary care visits? +Where can I find my explanation of benefits? +How do I find a doctor in my network? +How do I find a doctor in my network? +Can I add my spouse to my insurance plan? +How do I find a doctor in my network? +Does my plan cover urgent care visits? +How much is the copay for primary care visits? +How do I update my address or personal info? +Do I need a referral to see a specialist? +How do I find a doctor in my network? +Is mental health therapy covered? +What does my EPO plan cover? +What does my EPO plan cover? +Is telehealth included in my plan? +How do I find a doctor in my network? +What happens if I go to an out-of-network provider? +Is telehealth included in my plan? +Do I need a referral to see a specialist? +What does my EPO plan cover? +Where can I find my explanation of benefits? +Does my plan cover urgent care visits? +What is the deductible on my plan? +What is the status of my recent claim? +Where can I find my explanation of benefits? +Is knee surgery covered under my insurance? +How do I update my address or personal info? +How do I access my digital insurance card? +How much is the copay for urgent care? +Do I need a referral to see a specialist? +Where can I find my explanation of benefits? +How do I access my digital insurance card? +What happens if I go to an out-of-network provider? +What happens if I go to an out-of-network provider? +What are my out-of-pocket maximums? +Where can I find my explanation of benefits? +What prescription drugs are covered? +What happens if I go to an out-of-network provider? +How do I access my digital insurance card? +Is telehealth included in my plan? +What happens if I go to an out-of-network provider? +Can I add my spouse to my insurance plan? +What happens if I go to an out-of-network provider? +How do I appeal a denied claim? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +How do I update my address or personal info? +What does my EPO plan cover? +What is the status of my recent claim? +Are annual checkups fully covered? +Does my plan cover urgent care visits? +How do I update my address or personal info? +What is the deductible on my plan? +Is knee surgery covered under my insurance? +How do I update my address or personal info? +Are annual checkups fully covered? +What prescription drugs are covered? +Are annual checkups fully covered? +Is mental health therapy covered? +How do I file a reimbursement request? +Where can I find my explanation of benefits? +How much is the copay for ER visits? +Is mental health therapy covered? +How do I access my digital insurance card? +How do I update my address or personal info? +Is telehealth included in my plan? +Where can I find my explanation of benefits? +What is the deductible on my plan? +What is the status of my recent claim? +What are my out-of-pocket maximums? +What does my EPO plan cover? +Is flu shot covered under my insurance? +Where can I find my explanation of benefits? +Does my plan cover urgent care visits? +How do I appeal a denied claim? +Is mental health therapy covered? +What does my HDHP plan cover? +How much is the copay for primary care visits? +How do I file a reimbursement request? +Are annual checkups fully covered? +What is the status of my recent claim? +How do I update my address or personal info? +How do I appeal a denied claim? +Does my plan cover urgent care visits? +What are my out-of-pocket maximums? +Are annual checkups fully covered? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +How do I appeal a denied claim? +Is mental health therapy covered? +Does my plan cover urgent care visits? +Does my plan cover urgent care visits? +Is mental health therapy covered? +Are annual checkups fully covered? +Where can I find my explanation of benefits? +What is the status of my recent claim? +Is telehealth included in my plan? +How do I find a doctor in my network? +Are annual checkups fully covered? +How much is the copay for urgent care? +What is the deductible on my plan? +How much is the copay for ER visits? +Is mental health therapy covered? +How much is the copay for lab work? +Is telehealth included in my plan? +Do I need a referral to see a specialist? +How much is the copay for primary care visits? +Is mental health therapy covered? +What prescription drugs are covered? +How do I update my address or personal info? +How do I file a reimbursement request? +How much is the copay for lab work? +What is the deductible on my plan? +How much is the copay for specialist visits? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +What is the status of my recent claim? +How do I file a reimbursement request? +What is the deductible on my plan? +How do I find a doctor in my network? +What is the deductible on my plan? +What happens if I go to an out-of-network provider? +How do I file a reimbursement request? +Can I add my spouse to my insurance plan? +Is telehealth included in my plan? +How do I appeal a denied claim? +Is mental health therapy covered? +Is telehealth included in my plan? +How do I file a reimbursement request? +Does my plan cover urgent care visits? +How much is the copay for lab work? +What does my HMO plan cover? +What prescription drugs are covered? +Can I add my spouse to my insurance plan? +What prescription drugs are covered? +How do I appeal a denied claim? +What is the deductible on my plan? +How much is the copay for primary care visits? +Is mental health therapy covered? +Can I add my spouse to my insurance plan? +How do I access my digital insurance card? +How much is the copay for primary care visits? +How do I access my digital insurance card? +What is the deductible on my plan? +What prescription drugs are covered? +Are annual checkups fully covered? +How do I update my address or personal info? +What does my EPO plan cover? +What are my out-of-pocket maximums? +Does my plan cover urgent care visits? +What prescription drugs are covered? +How do I appeal a denied claim? +How do I find a doctor in my network? +How do I access my digital insurance card? +What are my out-of-pocket maximums? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +Is telehealth included in my plan? +What does my HDHP plan cover? +Can I add my spouse to my insurance plan? +How do I find a doctor in my network? +Are annual checkups fully covered? +How do I update my address or personal info? +What prescription drugs are covered? +What is the status of my recent claim? +Where can I find my explanation of benefits? +How do I appeal a denied claim? +How do I file a reimbursement request? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +What are my out-of-pocket maximums? +Do I need a referral to see a specialist? +Do I need a referral to see a specialist? +Does my plan cover urgent care visits? +How do I update my address or personal info? +What is the status of my recent claim? +Is knee surgery covered under my insurance? +What is the status of my recent claim? +What happens if I go to an out-of-network provider? +How do I find a doctor in my network? +How do I appeal a denied claim? +Do I need a referral to see a specialist? +How much is the copay for lab work? +Is telehealth included in my plan? +How do I file a reimbursement request? +Does my plan cover urgent care visits? +How do I file a reimbursement request? +What is the deductible on my plan? +Can I add my spouse to my insurance plan? +Is flu shot covered under my insurance? +How do I appeal a denied claim? +Is telehealth included in my plan? +Can I add my spouse to my insurance plan? +How do I appeal a denied claim? +What is the status of my recent claim? +What are my out-of-pocket maximums? +What is the status of my recent claim? +How do I access my digital insurance card? +What does my PPO plan cover? +Does my plan cover urgent care visits? +Are annual checkups fully covered? +How do I file a reimbursement request? +What is the deductible on my plan? +Is knee surgery covered under my insurance? +What prescription drugs are covered? +Can I add my spouse to my insurance plan? +Is knee surgery covered under my insurance? +How do I file a reimbursement request? +Are annual checkups fully covered? +How do I file a reimbursement request? +What prescription drugs are covered? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? +How do I file a reimbursement request? +How do I find a doctor in my network? +Where can I find my explanation of benefits? +What is the deductible on my plan? +What is the status of my recent claim? +How much is the copay for lab work? +How much is the copay for specialist visits? +What is the status of my recent claim? +Where can I find my explanation of benefits? +Is telehealth included in my plan? +Is mental health therapy covered? +How do I file a reimbursement request? +What are my out-of-pocket maximums? +How do I file a reimbursement request? +How do I access my digital insurance card? +How much is the copay for primary care visits? +Are annual checkups fully covered? +How much is the copay for ER visits? +How do I find a doctor in my network? +How do I access my digital insurance card? +Does my plan cover urgent care visits? +What happens if I go to an out-of-network provider? +What is the status of my recent claim? +What does my HDHP plan cover? +How do I appeal a denied claim? +What happens if I go to an out-of-network provider? +Is knee surgery covered under my insurance? +How do I file a reimbursement request? +What is the deductible on my plan? +Is MRI scan covered under my insurance? +What happens if I go to an out-of-network provider? +What are my out-of-pocket maximums? +Is telehealth included in my plan? +Is mental health therapy covered? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What happens if I go to an out-of-network provider? +Where can I find my explanation of benefits? +What does my PPO plan cover? +Can I add my spouse to my insurance plan? +Can I add my spouse to my insurance plan? diff --git a/articles/websocket-chatbot-js/gatling/typescript/resources/logback-test.xml b/articles/websocket-chatbot-js/gatling/typescript/resources/logback-test.xml new file mode 100644 index 0000000..2667f9e --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/resources/logback-test.xml @@ -0,0 +1,19 @@ + + + + + + %d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx + + false + + + + + + + + + + + diff --git a/articles/websocket-chatbot-js/gatling/typescript/src/chatbotSimulation.gatling.ts b/articles/websocket-chatbot-js/gatling/typescript/src/chatbotSimulation.gatling.ts new file mode 100644 index 0000000..b1e98c6 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/src/chatbotSimulation.gatling.ts @@ -0,0 +1,100 @@ +/** + * Gatling simulation script for load testing a WebSocket-based chatbot application. + * + * @module chatbotSimulation.gatling + */ + +import { + simulation, + constantUsersPerSec, + scenario, + feed, + pause, + exec, + repeat, + regex, + csv, + getParameter, +} from "@gatling.io/core"; +import { http, ws } from "@gatling.io/http"; + +/** + * Main Gatling simulation definition. + */ +export default simulation((setUp) => { + + const baseUrl = getParameter("baseUrl", "http://localhost:3000"); + const wsBaseUrl = getParameter("wsBaseUrl", "ws://localhost:3000"); + const usersPerSec = parseInt(getParameter("usersPerSec", "2")); + const durationSeconds = parseInt(getParameter("durationSeconds", "15")); + const questionsFeeder = csv("resources/health_insurance_chatbot_questions.csv").random(); + const httpProtocol = http + .baseUrl(baseUrl) + .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .doNotTrackHeader("1") + .acceptLanguageHeader("en-US,en;q=0.5") + .acceptEncodingHeader("gzip, deflate") + .userAgentHeader("Gatling2") + .wsBaseUrl(wsBaseUrl); + + /** + * @constant {ScenarioBuilder} scn - Scenario definition for WebSocket interaction. + */ + const scn = scenario("WebSocket") + .exec( + /** + * Sends an HTTP GET request to the home page. + */ + http("Home").get("/"), + pause(1), + /** + * Sets a unique user ID in the session. + * + * @param {Session} session - The Gatling session object. + * @returns {Session} The updated session. + */ + exec((session) => session.set("id", "Gatling" + session.userId())), + + ws("Connect WS").connect("/"), + + pause(1), + /** + * Determines a random number of customer questions for this session. + * + * @param {Session} session - The Gatling session object. + * @returns {Session} The updated session with a random question count. + */ + exec((session) => + session.set("maxQuestions", Math.floor(Math.random() * 10) + 1), + ), + /** + * Repeats sending customer questions and awaiting chatbot responses. + * + * @param {number} i - The iteration index. + */ + repeat((session) => session.get("maxQuestions"), "i").on( + feed(questionsFeeder), + /** + * Sends a user question over WebSocket and awaits a response. + */ + ws("Customer Question") + .sendText((session) => session.get("user_question")) + .await(30).on( + /** + * Checks for a chatbot response message matching any text. + */ + ws.checkTextMessage("Chatbot Response").check(regex("(.*)")), + ), + ), + + pause(1), + + ws("Close WS").close(), + ); + /** + * Sets up the scenario with the specified injection profile and protocol. + */ + setUp( + scn.injectOpen(constantUsersPerSec(usersPerSec).during(durationSeconds)), + ).protocols(httpProtocol); +}); diff --git a/articles/websocket-chatbot-js/gatling/typescript/tsconfig.json b/articles/websocket-chatbot-js/gatling/typescript/tsconfig.json new file mode 100644 index 0000000..ed09328 --- /dev/null +++ b/articles/websocket-chatbot-js/gatling/typescript/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "outDir": "target", + "lib": ["es2021", "dom"], + "target": "es2021", + "module": "es2020", + "moduleResolution": "Node", + "strict": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*.ts"], + "exclude": ["**/*.test.ts"] +} diff --git a/articles/websocket-chatbot-js/package-lock.json b/articles/websocket-chatbot-js/package-lock.json new file mode 100644 index 0000000..c144bc0 --- /dev/null +++ b/articles/websocket-chatbot-js/package-lock.json @@ -0,0 +1,37 @@ +{ + "name": "chatbot-demo-ws", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chatbot-demo-ws", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ws": "^8.18.3" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/articles/websocket-chatbot-js/package.json b/articles/websocket-chatbot-js/package.json new file mode 100644 index 0000000..02e6478 --- /dev/null +++ b/articles/websocket-chatbot-js/package.json @@ -0,0 +1,16 @@ +{ + "name": "chatbot-demo-ws", + "version": "1.0.0", + "description": "Simple WebSocket chatbot demo", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "dependencies": { + "ws": "^8.18.3" + } +} diff --git a/articles/websocket-chatbot-js/public/index.html b/articles/websocket-chatbot-js/public/index.html new file mode 100644 index 0000000..47f8b81 --- /dev/null +++ b/articles/websocket-chatbot-js/public/index.html @@ -0,0 +1,188 @@ + + + + + + WebSocket Load Testing Demo + + + +
+

Parrot Health WebSocket Demo

+ Parrot Health Logo +
+
Connect and start chatting!
+
+ +
+ + +
+ +
Connecting...
+
+ + + + \ No newline at end of file diff --git a/articles/websocket-chatbot-js/public/parrot.svg b/articles/websocket-chatbot-js/public/parrot.svg new file mode 100644 index 0000000..7fdd421 --- /dev/null +++ b/articles/websocket-chatbot-js/public/parrot.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/articles/websocket-chatbot-js/server.js b/articles/websocket-chatbot-js/server.js new file mode 100644 index 0000000..9bfa920 --- /dev/null +++ b/articles/websocket-chatbot-js/server.js @@ -0,0 +1,79 @@ +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const WebSocket = require('ws'); + +// HTTP server for serving static files +const server = http.createServer((req, res) => { + const reqPath = req.url === '/' ? '/index.html' : decodeURIComponent(req.url); + const filePath = path.join(__dirname, 'public', reqPath); + + fs.readFile(filePath, (err, content) => { + if (err) { + res.writeHead(404); + res.end('File not found'); + return; + } + + const ext = path.extname(filePath).toLowerCase(); + const contentTypes = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon' + }; + + res.writeHead(200, { 'Content-Type': contentTypes[ext] || 'text/plain' }); + res.end(content); + }); +}); + +// WebSocket server +const wss = new WebSocket.Server({ server }); + +wss.on('connection', (ws) => { + console.log('Client connected'); + const timers = new Set(); + + // Clean up timers when connection closes + const cleanup = () => { + timers.forEach(timer => clearTimeout(timer)); + timers.clear(); + }; + + ws.on('close', cleanup); + ws.on('error', (err) => { + console.error('WebSocket error:', err); + cleanup(); + }); + + ws.on('message', (data) => { + const message = data.toString(); + + // Handle close command + if (message.trim().toLowerCase() === 'close') { + cleanup(); + ws.close(); + return; + } + + // Echo back with random delay (0-5 seconds) + const reply = `PARROT: "${message}"`; + const delay = Math.random() * 5000; + + const timer = setTimeout(() => { + timers.delete(timer); + if (ws.readyState === WebSocket.OPEN) { + ws.send(reply); + } + }, delay); + + timers.add(timer); + }); +}); + +const PORT = process.env.PORT || 3000; +server.listen(PORT, () => { + console.log(`Server running at http://localhost:${PORT}`); +}); \ No newline at end of file diff --git a/articles/websocket-chatbot-js/src/input.css b/articles/websocket-chatbot-js/src/input.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/articles/websocket-chatbot-js/src/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities;