├── .github └── workflows │ ├── main.yml │ └── release.yml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── NOTICE ├── README.md ├── SECURITY.md ├── media └── minibone.png ├── package.json ├── pnpm-lock.yaml ├── rollup.config.js ├── src ├── canonical.ts ├── cbor.ts ├── core.ts ├── index.ts └── types.ts ├── tests └── index.test.ts └── tsconfig.json /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Main 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - '*' 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v4 17 | 18 | - name: Setup node 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: '20' 22 | 23 | - name: Setup pnpm 24 | uses: pnpm/action-setup@v2 25 | with: 26 | version: 8 27 | 28 | - name: Install dependencies 29 | run: pnpm install --frozen-lockfile 30 | 31 | - name: Format repository 32 | run: pnpm format 33 | 34 | - name: Test repository 35 | run: pnpm test 36 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | tags: 7 | - 'v*.*.*' 8 | 9 | jobs: 10 | publish: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@master 15 | 16 | - name: Setup node 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: '20' 20 | registry-url: https://registry.npmjs.org/ 21 | 22 | - name: Setup pnpm 23 | uses: pnpm/action-setup@v2 24 | with: 25 | version: 8 26 | 27 | - name: Install dependencies 28 | run: pnpm install --frozen-lockfile 29 | 30 | - name: Build package 31 | run: pnpm build 32 | 33 | - name: Publish package 34 | env: 35 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 36 | run: npm publish --access public 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directory 2 | node_modules 3 | 4 | # Editors 5 | .idea 6 | .vscode 7 | *.iml 8 | 9 | # Ignore cache files 10 | tsconfig.tsbuildinfo 11 | .rollup.cache 12 | 13 | # Ignore log files 14 | **/*.log 15 | 16 | # Ignore build files 17 | **/dist 18 | **/dist-pkg 19 | **/target 20 | 21 | # Ignore Jest coverage report files 22 | coverage 23 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ### ♻ Contributing 2 | 3 | We appreciate your interest in contributing to Minibone. The best way to get started is to file issues and participate in discussions on GitHub. You're likewise welcome to contribute by submitting pull requests to address open issues, improve the test suite, code readability or even to improve documentation. 4 | 5 | If you're instead looking to discuss the direction of the project, we'd prefer if you email us at [root@backbone.dev](mailto:root@backbone.dev). 6 | 7 | This module is maintained with 🦴 by [Backbone](https://backbone.dev) 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | Copyright 2024-present Backbone Technologies Ltd. 2 | 3 | This product includes software developed by Backbone (https://www.backbone.dev/). 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ![Minibone](https://github.com/backbone-hq/minibone/blob/master/media/minibone.png?raw=true) 2 | 3 | ![Build Status](https://img.shields.io/github/actions/workflow/status/backbone-hq/minibone/main.yml?branch=master) 4 | ![GitHub License](https://img.shields.io/github/license/backbone-hq/minibone) 5 | ![NPM Version](https://img.shields.io/npm/v/minibone?logo=npm) 6 | ![Made by Backbone](https://img.shields.io/badge/made_by-backbone-blue) 7 | 8 | Minibone is a compact, versatile, and misuse-resistant library designed to make incorporating end-to-end encryption in your applications **remarkably simple**. It allows you to store and manage your users' sensitive data while ensuring that only the users themselves can access and decrypt the information — helping you minimize the blast radius of breaches, meet compliance requirements, enhance privacy, and build trust. 9 | 10 | Building _secure-by-design_ applications is _hard_. Minibone makes it _practical_. 11 | 12 | ### 🏗️ Background 13 | 14 | Minibone is built atop the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API). It's restricted to a _conservative_ suite of symmetric algorithms for quantum resistance and robustness. 15 | 16 | Specifically, Minibone uses `AES-GCM-256` for encryption, `HKDF-SHA-256` for key derivation, and `PBKDF2-SHA-256` with 500,000 iterations for password-based key derivation. Minibone also opts to keep its dependencies to the bare minimum to reduce the risk of supply-chain attacks. 17 | 18 | ### ☢️ Threat Model 19 | 20 | Minibone is designed to run on a `client` device (e.g., your desktop, mobile, or web-based app), storing data with a `provider` (e.g., a SaaS platform) through a `communication channel` (e.g., HTTPS). In this scenario, Minibone is designed to assure confidentiality and integrity, but not availability [1] or freshness [2], when the `provider` and/or the `communication channel` are compromised. 21 | 22 | We assume that the client application and device are not compromised and not otherwise vulnerable to side-channel attacks. 23 | 24 | 1. A malicious `provider` could selectively delete data they store. 25 |    A compromised `communication channel` could selectively drop messages based on metadata. 26 | 2. A malicious `provider` could selectively revert data to earlier versions. 27 |    A compromised `communication channel` could replay messages associated with earlier versions. 28 | 29 | ### 💾 Installation 30 | 31 | Minibone is hosted on [NPM](https://www.npmjs.com/package/minibone). 32 | You can add it to your project by running the `npm` command below or an equivalent command in your package manager. 33 | 34 | ```bash 35 | npm i minibone 36 | ``` 37 | 38 | ### 📇 Usage 39 | 40 | ```typescript 41 | import Minibone from 'minibone' 42 | 43 | // Define a unique service identifier 44 | const serviceIdentifier: any = 'my-unique-service-identifier' 45 | 46 | // Virtual API, communication channel and storage provider 47 | class Backend { 48 | private userBundles: Map = new Map() 49 | private dataBundles: Map = new Map() 50 | 51 | registerUser = async (uid: string, bundle: Uint8Array): Promise => {this.userBundles.set(uid, bundle)} 52 | fetchUser = async (uid: string): Promise => this.userBundles.get(uid) ?? new Uint8Array() 53 | putData = async (uid: string, data: Uint8Array): Promise => {this.dataBundles.set(uid, data)} 54 | fetchData = async (uid: string): Promise => this.dataBundles.get(uid) ?? new Uint8Array() 55 | } 56 | const virtualBackend = new Backend(); 57 | 58 | // Register a user; initialize their minibone instance 59 | const minibone: Minibone = await Minibone.create() 60 | 61 | // Encrypt and send the user's minibone to the provider 62 | const userName: any = 'some-unique-user-name' 63 | const payload: Uint8Array = await minibone.save('secure-user-secret', [serviceIdentifier, userName]) 64 | await virtualBackend.registerUser(userName, payload) 65 | 66 | // Encrypt user data 67 | const data: any = { 68 | sq6wmgv2zcsrix6t: 'BETWEEN SUBTLE SHADING AND THE ABSENCE OF LIGHT LIES THE NUANCE OF IQLUSION.', 69 | } 70 | const encrypted: Uint8Array = await minibone.encrypt(data) 71 | await virtualBackend.putData(minibone.uid, encrypted) 72 | 73 | // Fetch and load the user's minibone. You probably want to guard payload retrieval behind multi-factor authentication in production. 74 | const payload: Uint8Array = await virtualBackend.fetchUser(userName) 75 | const loadedMinibone: Minibone = await Minibone.load(payload, 'secure-user-secret', [serviceIdentifier, userName]) 76 | 77 | // Decrypt data using the reconstructed minibone 78 | const fetched: Uint8Array = await virtualBackend.fetchData(minibone.uid) 79 | const decryptedData: any = await loadedMinibone.decrypt(fetched) 80 | ``` 81 | 82 | ### 📢 Caveats 83 | 84 | Minibone is designed to be simple to use and difficult to abuse. That said, there are a few important aspects to keep in mind when interfacing with Minibone. 85 | 86 | 1. It's important for the context vector (the second parameter of `minibone.save` and third parameter of `Minibone.load`) to be _globally_ unique to reduce the risk of key reuse and maximize the marginal cost of [rainbow table](https://en.wikipedia.org/wiki/Rainbow_table) attacks. 87 | 2. When prompting end users for a passphrase or master secret, this secret **must** remain client-side. We recommend using a battle-tested password strength estimator (e.g., [zxcvbn](https://github.com/dropbox/zxcvbn)). **User secrets should be deleted immediately after use** to make it just that bit harder for attackers. 88 | 89 | ### 🧩 Limitations 90 | Minibone relies _solely_ on symmetric cryptography. While this makes it robust against a number of contemporary and future attacks, it also makes data sharing, assured identity, access control, and real-time collaborative workflows infeasible to implement. 91 | 92 | Minibone's enterprise counterpart, [Backbone](https://backbone.dev), was designed from first principles to support complex multi-user, multi-enterprise workflows under total end-to-end encryption with a stricter threat model. 93 | 94 | If these are a priority, reach out to us by emailing us at [root@backbone.dev](mailto:root@backbone.dev). 95 | 96 | --- 97 | 98 | Built with 🦴 by [Backbone](https://backbone.dev) 99 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # 🔒 Security Policy 2 | 3 | It's critical that if a Minibone vulnerability exists, impact is minimized. 4 | 5 | ## 🛂 Reporting a Vulnerability 6 | 7 | **Please refrain from reporting security vulnerabilities through public channels such as Github issues or discussions.** 8 | 9 | If you believe you've found a vulnerability, we'd appreciate if you responsibly disclose it by emailing [root@backbone.dev](mailto:root@backbone.dev). Try to be as explicit and detail-oriented as possible when describing how to reproduce the issue. 10 | 11 | Providing code snippets, error messages, screenshots and other auxiliary information will go a long way in helping us prepare a fix. 12 | 13 | ## 📢 Public Disclosure 14 | 15 | We hold ourselves to a strict 30-day public disclosure policy for non-critical vulnerabilities and a 60-day policy for critical vulnerabilities to ensure sufficient uptake of a patch prior to disclosure. 16 | 17 | With your permission, we're happy to support you by co-authoring or disseminating blog posts and other technical material to educate and notify Minibone users. 18 | -------------------------------------------------------------------------------- /media/minibone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/backbone-hq/minibone/64f9f1bb48ffc2d118ffe48c714abb8ddc025950/media/minibone.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minibone", 3 | "version": "0.5.1", 4 | "description": "A compact, versatile, and misuse-resistant library for end-to-end-encryption", 5 | "keywords": [ 6 | "security", 7 | "webcrypto", 8 | "crypto", 9 | "cryptography", 10 | "encryption", 11 | "end-to-end-encryption" 12 | ], 13 | "main": "dist", 14 | "type": "module", 15 | "repository": "https://github.com/backbone-hq/minibone", 16 | "author": "Backbone Founders ", 17 | "license": "Apache-2.0", 18 | "files": [ 19 | "dist/*" 20 | ], 21 | "exports": { 22 | ".": "./dist/bundle.js" 23 | }, 24 | "dependencies": { 25 | "cbor-x": "^1.6.0", 26 | "detect-node": "^2.1.0" 27 | }, 28 | "devDependencies": { 29 | "@rollup/plugin-commonjs": "^25.0.8", 30 | "@rollup/plugin-node-resolve": "^15.3.1", 31 | "@rollup/plugin-terser": "^0.4.4", 32 | "@types/detect-node": "^2.0.2", 33 | "@types/jest": "^29.5.14", 34 | "@types/node": "^22.13.8", 35 | "esbuild": "^0.25.0", 36 | "jest": "^29.7.0", 37 | "jest-environment-jsdom": "^29.7.0", 38 | "prettier": "^3.5.2", 39 | "rimraf": "^5.0.10", 40 | "rollup": "^4.34.9", 41 | "rollup-plugin-dts": "^6.1.1", 42 | "rollup-plugin-esbuild": "^6.2.1", 43 | "ts-jest": "^29.2.6", 44 | "tslib": "^2.8.1", 45 | "typescript": "^5.8.2" 46 | }, 47 | "scripts": { 48 | "preinstall": "npx only-allow pnpm", 49 | "clean": "rimraf ./coverage ./dist ./.rollup.cache ./tsconfig.tsbuildinfo", 50 | "build": "pnpm clean && rollup -c rollup.config.js", 51 | "format": "prettier 'src/**/*.ts' 'tests/**/*.ts' --write", 52 | "coverage": "jest --coverage", 53 | "test": "jest" 54 | }, 55 | "prettier": { 56 | "semi": false, 57 | "tabWidth": 2, 58 | "useTabs": false, 59 | "singleQuote": true, 60 | "trailingComma": "none", 61 | "bracketSpacing": true, 62 | "printWidth": 120 63 | }, 64 | "jest": { 65 | "verbose": true, 66 | "projects": [ 67 | { 68 | "displayName": "node", 69 | "preset": "ts-jest", 70 | "testEnvironment": "node", 71 | "testMatch": [ 72 | "**/*.test.ts" 73 | ] 74 | }, 75 | { 76 | "displayName": "jsdom", 77 | "preset": "ts-jest", 78 | "testEnvironment": "jsdom", 79 | "testMatch": [ 80 | "**/*.test.ts" 81 | ], 82 | "moduleNameMapper": { 83 | "cbor-x": "/node_modules/cbor-x/dist/index.min.js" 84 | } 85 | } 86 | ] 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | cbor-x: 9 | specifier: ^1.6.0 10 | version: 1.6.0 11 | detect-node: 12 | specifier: ^2.1.0 13 | version: 2.1.0 14 | 15 | devDependencies: 16 | '@rollup/plugin-commonjs': 17 | specifier: ^25.0.8 18 | version: 25.0.8(rollup@4.34.9) 19 | '@rollup/plugin-node-resolve': 20 | specifier: ^15.3.1 21 | version: 15.3.1(rollup@4.34.9) 22 | '@rollup/plugin-terser': 23 | specifier: ^0.4.4 24 | version: 0.4.4(rollup@4.34.9) 25 | '@types/detect-node': 26 | specifier: ^2.0.2 27 | version: 2.0.2 28 | '@types/jest': 29 | specifier: ^29.5.14 30 | version: 29.5.14 31 | '@types/node': 32 | specifier: ^22.13.8 33 | version: 22.13.8 34 | esbuild: 35 | specifier: ^0.25.0 36 | version: 0.25.0 37 | jest: 38 | specifier: ^29.7.0 39 | version: 29.7.0(@types/node@22.13.8) 40 | jest-environment-jsdom: 41 | specifier: ^29.7.0 42 | version: 29.7.0 43 | prettier: 44 | specifier: ^3.5.2 45 | version: 3.5.2 46 | rimraf: 47 | specifier: ^5.0.10 48 | version: 5.0.10 49 | rollup: 50 | specifier: ^4.34.9 51 | version: 4.34.9 52 | rollup-plugin-dts: 53 | specifier: ^6.1.1 54 | version: 6.1.1(rollup@4.34.9)(typescript@5.8.2) 55 | rollup-plugin-esbuild: 56 | specifier: ^6.2.1 57 | version: 6.2.1(esbuild@0.25.0)(rollup@4.34.9) 58 | ts-jest: 59 | specifier: ^29.2.6 60 | version: 29.2.6(@babel/core@7.26.9)(esbuild@0.25.0)(jest@29.7.0)(typescript@5.8.2) 61 | tslib: 62 | specifier: ^2.8.1 63 | version: 2.8.1 64 | typescript: 65 | specifier: ^5.8.2 66 | version: 5.8.2 67 | 68 | packages: 69 | 70 | /@ampproject/remapping@2.3.0: 71 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 72 | engines: {node: '>=6.0.0'} 73 | dependencies: 74 | '@jridgewell/gen-mapping': 0.3.8 75 | '@jridgewell/trace-mapping': 0.3.25 76 | dev: true 77 | 78 | /@babel/code-frame@7.26.2: 79 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 80 | engines: {node: '>=6.9.0'} 81 | dependencies: 82 | '@babel/helper-validator-identifier': 7.25.9 83 | js-tokens: 4.0.0 84 | picocolors: 1.1.1 85 | dev: true 86 | 87 | /@babel/compat-data@7.26.8: 88 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 89 | engines: {node: '>=6.9.0'} 90 | dev: true 91 | 92 | /@babel/core@7.26.9: 93 | resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} 94 | engines: {node: '>=6.9.0'} 95 | dependencies: 96 | '@ampproject/remapping': 2.3.0 97 | '@babel/code-frame': 7.26.2 98 | '@babel/generator': 7.26.9 99 | '@babel/helper-compilation-targets': 7.26.5 100 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) 101 | '@babel/helpers': 7.26.9 102 | '@babel/parser': 7.26.9 103 | '@babel/template': 7.26.9 104 | '@babel/traverse': 7.26.9 105 | '@babel/types': 7.26.9 106 | convert-source-map: 2.0.0 107 | debug: 4.4.0 108 | gensync: 1.0.0-beta.2 109 | json5: 2.2.3 110 | semver: 6.3.1 111 | transitivePeerDependencies: 112 | - supports-color 113 | dev: true 114 | 115 | /@babel/generator@7.26.9: 116 | resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/parser': 7.26.9 120 | '@babel/types': 7.26.9 121 | '@jridgewell/gen-mapping': 0.3.8 122 | '@jridgewell/trace-mapping': 0.3.25 123 | jsesc: 3.1.0 124 | dev: true 125 | 126 | /@babel/helper-compilation-targets@7.26.5: 127 | resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} 128 | engines: {node: '>=6.9.0'} 129 | dependencies: 130 | '@babel/compat-data': 7.26.8 131 | '@babel/helper-validator-option': 7.25.9 132 | browserslist: 4.24.4 133 | lru-cache: 5.1.1 134 | semver: 6.3.1 135 | dev: true 136 | 137 | /@babel/helper-module-imports@7.25.9: 138 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 139 | engines: {node: '>=6.9.0'} 140 | dependencies: 141 | '@babel/traverse': 7.26.9 142 | '@babel/types': 7.26.9 143 | transitivePeerDependencies: 144 | - supports-color 145 | dev: true 146 | 147 | /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9): 148 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 149 | engines: {node: '>=6.9.0'} 150 | peerDependencies: 151 | '@babel/core': ^7.0.0 152 | dependencies: 153 | '@babel/core': 7.26.9 154 | '@babel/helper-module-imports': 7.25.9 155 | '@babel/helper-validator-identifier': 7.25.9 156 | '@babel/traverse': 7.26.9 157 | transitivePeerDependencies: 158 | - supports-color 159 | dev: true 160 | 161 | /@babel/helper-plugin-utils@7.26.5: 162 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 163 | engines: {node: '>=6.9.0'} 164 | dev: true 165 | 166 | /@babel/helper-string-parser@7.25.9: 167 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 168 | engines: {node: '>=6.9.0'} 169 | dev: true 170 | 171 | /@babel/helper-validator-identifier@7.25.9: 172 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 173 | engines: {node: '>=6.9.0'} 174 | dev: true 175 | 176 | /@babel/helper-validator-option@7.25.9: 177 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 178 | engines: {node: '>=6.9.0'} 179 | dev: true 180 | 181 | /@babel/helpers@7.26.9: 182 | resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} 183 | engines: {node: '>=6.9.0'} 184 | dependencies: 185 | '@babel/template': 7.26.9 186 | '@babel/types': 7.26.9 187 | dev: true 188 | 189 | /@babel/parser@7.26.9: 190 | resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} 191 | engines: {node: '>=6.0.0'} 192 | hasBin: true 193 | dependencies: 194 | '@babel/types': 7.26.9 195 | dev: true 196 | 197 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9): 198 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 199 | peerDependencies: 200 | '@babel/core': ^7.0.0-0 201 | dependencies: 202 | '@babel/core': 7.26.9 203 | '@babel/helper-plugin-utils': 7.26.5 204 | dev: true 205 | 206 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.9): 207 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 208 | peerDependencies: 209 | '@babel/core': ^7.0.0-0 210 | dependencies: 211 | '@babel/core': 7.26.9 212 | '@babel/helper-plugin-utils': 7.26.5 213 | dev: true 214 | 215 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9): 216 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 217 | peerDependencies: 218 | '@babel/core': ^7.0.0-0 219 | dependencies: 220 | '@babel/core': 7.26.9 221 | '@babel/helper-plugin-utils': 7.26.5 222 | dev: true 223 | 224 | /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.9): 225 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 226 | engines: {node: '>=6.9.0'} 227 | peerDependencies: 228 | '@babel/core': ^7.0.0-0 229 | dependencies: 230 | '@babel/core': 7.26.9 231 | '@babel/helper-plugin-utils': 7.26.5 232 | dev: true 233 | 234 | /@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.9): 235 | resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 236 | engines: {node: '>=6.9.0'} 237 | peerDependencies: 238 | '@babel/core': ^7.0.0-0 239 | dependencies: 240 | '@babel/core': 7.26.9 241 | '@babel/helper-plugin-utils': 7.26.5 242 | dev: true 243 | 244 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9): 245 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 246 | peerDependencies: 247 | '@babel/core': ^7.0.0-0 248 | dependencies: 249 | '@babel/core': 7.26.9 250 | '@babel/helper-plugin-utils': 7.26.5 251 | dev: true 252 | 253 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.9): 254 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 255 | peerDependencies: 256 | '@babel/core': ^7.0.0-0 257 | dependencies: 258 | '@babel/core': 7.26.9 259 | '@babel/helper-plugin-utils': 7.26.5 260 | dev: true 261 | 262 | /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.9): 263 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 264 | engines: {node: '>=6.9.0'} 265 | peerDependencies: 266 | '@babel/core': ^7.0.0-0 267 | dependencies: 268 | '@babel/core': 7.26.9 269 | '@babel/helper-plugin-utils': 7.26.5 270 | dev: true 271 | 272 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9): 273 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 274 | peerDependencies: 275 | '@babel/core': ^7.0.0-0 276 | dependencies: 277 | '@babel/core': 7.26.9 278 | '@babel/helper-plugin-utils': 7.26.5 279 | dev: true 280 | 281 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9): 282 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 283 | peerDependencies: 284 | '@babel/core': ^7.0.0-0 285 | dependencies: 286 | '@babel/core': 7.26.9 287 | '@babel/helper-plugin-utils': 7.26.5 288 | dev: true 289 | 290 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9): 291 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 292 | peerDependencies: 293 | '@babel/core': ^7.0.0-0 294 | dependencies: 295 | '@babel/core': 7.26.9 296 | '@babel/helper-plugin-utils': 7.26.5 297 | dev: true 298 | 299 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9): 300 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 301 | peerDependencies: 302 | '@babel/core': ^7.0.0-0 303 | dependencies: 304 | '@babel/core': 7.26.9 305 | '@babel/helper-plugin-utils': 7.26.5 306 | dev: true 307 | 308 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9): 309 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 310 | peerDependencies: 311 | '@babel/core': ^7.0.0-0 312 | dependencies: 313 | '@babel/core': 7.26.9 314 | '@babel/helper-plugin-utils': 7.26.5 315 | dev: true 316 | 317 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9): 318 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 319 | peerDependencies: 320 | '@babel/core': ^7.0.0-0 321 | dependencies: 322 | '@babel/core': 7.26.9 323 | '@babel/helper-plugin-utils': 7.26.5 324 | dev: true 325 | 326 | /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.9): 327 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 328 | engines: {node: '>=6.9.0'} 329 | peerDependencies: 330 | '@babel/core': ^7.0.0-0 331 | dependencies: 332 | '@babel/core': 7.26.9 333 | '@babel/helper-plugin-utils': 7.26.5 334 | dev: true 335 | 336 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.9): 337 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 338 | engines: {node: '>=6.9.0'} 339 | peerDependencies: 340 | '@babel/core': ^7.0.0-0 341 | dependencies: 342 | '@babel/core': 7.26.9 343 | '@babel/helper-plugin-utils': 7.26.5 344 | dev: true 345 | 346 | /@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.9): 347 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 348 | engines: {node: '>=6.9.0'} 349 | peerDependencies: 350 | '@babel/core': ^7.0.0-0 351 | dependencies: 352 | '@babel/core': 7.26.9 353 | '@babel/helper-plugin-utils': 7.26.5 354 | dev: true 355 | 356 | /@babel/template@7.26.9: 357 | resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} 358 | engines: {node: '>=6.9.0'} 359 | dependencies: 360 | '@babel/code-frame': 7.26.2 361 | '@babel/parser': 7.26.9 362 | '@babel/types': 7.26.9 363 | dev: true 364 | 365 | /@babel/traverse@7.26.9: 366 | resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} 367 | engines: {node: '>=6.9.0'} 368 | dependencies: 369 | '@babel/code-frame': 7.26.2 370 | '@babel/generator': 7.26.9 371 | '@babel/parser': 7.26.9 372 | '@babel/template': 7.26.9 373 | '@babel/types': 7.26.9 374 | debug: 4.4.0 375 | globals: 11.12.0 376 | transitivePeerDependencies: 377 | - supports-color 378 | dev: true 379 | 380 | /@babel/types@7.26.9: 381 | resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} 382 | engines: {node: '>=6.9.0'} 383 | dependencies: 384 | '@babel/helper-string-parser': 7.25.9 385 | '@babel/helper-validator-identifier': 7.25.9 386 | dev: true 387 | 388 | /@bcoe/v8-coverage@0.2.3: 389 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 390 | dev: true 391 | 392 | /@cbor-extract/cbor-extract-darwin-arm64@2.2.0: 393 | resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} 394 | cpu: [arm64] 395 | os: [darwin] 396 | requiresBuild: true 397 | dev: false 398 | optional: true 399 | 400 | /@cbor-extract/cbor-extract-darwin-x64@2.2.0: 401 | resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} 402 | cpu: [x64] 403 | os: [darwin] 404 | requiresBuild: true 405 | dev: false 406 | optional: true 407 | 408 | /@cbor-extract/cbor-extract-linux-arm64@2.2.0: 409 | resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} 410 | cpu: [arm64] 411 | os: [linux] 412 | requiresBuild: true 413 | dev: false 414 | optional: true 415 | 416 | /@cbor-extract/cbor-extract-linux-arm@2.2.0: 417 | resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} 418 | cpu: [arm] 419 | os: [linux] 420 | requiresBuild: true 421 | dev: false 422 | optional: true 423 | 424 | /@cbor-extract/cbor-extract-linux-x64@2.2.0: 425 | resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} 426 | cpu: [x64] 427 | os: [linux] 428 | requiresBuild: true 429 | dev: false 430 | optional: true 431 | 432 | /@cbor-extract/cbor-extract-win32-x64@2.2.0: 433 | resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} 434 | cpu: [x64] 435 | os: [win32] 436 | requiresBuild: true 437 | dev: false 438 | optional: true 439 | 440 | /@esbuild/aix-ppc64@0.25.0: 441 | resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} 442 | engines: {node: '>=18'} 443 | cpu: [ppc64] 444 | os: [aix] 445 | requiresBuild: true 446 | dev: true 447 | optional: true 448 | 449 | /@esbuild/android-arm64@0.25.0: 450 | resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} 451 | engines: {node: '>=18'} 452 | cpu: [arm64] 453 | os: [android] 454 | requiresBuild: true 455 | dev: true 456 | optional: true 457 | 458 | /@esbuild/android-arm@0.25.0: 459 | resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} 460 | engines: {node: '>=18'} 461 | cpu: [arm] 462 | os: [android] 463 | requiresBuild: true 464 | dev: true 465 | optional: true 466 | 467 | /@esbuild/android-x64@0.25.0: 468 | resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} 469 | engines: {node: '>=18'} 470 | cpu: [x64] 471 | os: [android] 472 | requiresBuild: true 473 | dev: true 474 | optional: true 475 | 476 | /@esbuild/darwin-arm64@0.25.0: 477 | resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} 478 | engines: {node: '>=18'} 479 | cpu: [arm64] 480 | os: [darwin] 481 | requiresBuild: true 482 | dev: true 483 | optional: true 484 | 485 | /@esbuild/darwin-x64@0.25.0: 486 | resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} 487 | engines: {node: '>=18'} 488 | cpu: [x64] 489 | os: [darwin] 490 | requiresBuild: true 491 | dev: true 492 | optional: true 493 | 494 | /@esbuild/freebsd-arm64@0.25.0: 495 | resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} 496 | engines: {node: '>=18'} 497 | cpu: [arm64] 498 | os: [freebsd] 499 | requiresBuild: true 500 | dev: true 501 | optional: true 502 | 503 | /@esbuild/freebsd-x64@0.25.0: 504 | resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} 505 | engines: {node: '>=18'} 506 | cpu: [x64] 507 | os: [freebsd] 508 | requiresBuild: true 509 | dev: true 510 | optional: true 511 | 512 | /@esbuild/linux-arm64@0.25.0: 513 | resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} 514 | engines: {node: '>=18'} 515 | cpu: [arm64] 516 | os: [linux] 517 | requiresBuild: true 518 | dev: true 519 | optional: true 520 | 521 | /@esbuild/linux-arm@0.25.0: 522 | resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} 523 | engines: {node: '>=18'} 524 | cpu: [arm] 525 | os: [linux] 526 | requiresBuild: true 527 | dev: true 528 | optional: true 529 | 530 | /@esbuild/linux-ia32@0.25.0: 531 | resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} 532 | engines: {node: '>=18'} 533 | cpu: [ia32] 534 | os: [linux] 535 | requiresBuild: true 536 | dev: true 537 | optional: true 538 | 539 | /@esbuild/linux-loong64@0.25.0: 540 | resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} 541 | engines: {node: '>=18'} 542 | cpu: [loong64] 543 | os: [linux] 544 | requiresBuild: true 545 | dev: true 546 | optional: true 547 | 548 | /@esbuild/linux-mips64el@0.25.0: 549 | resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} 550 | engines: {node: '>=18'} 551 | cpu: [mips64el] 552 | os: [linux] 553 | requiresBuild: true 554 | dev: true 555 | optional: true 556 | 557 | /@esbuild/linux-ppc64@0.25.0: 558 | resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} 559 | engines: {node: '>=18'} 560 | cpu: [ppc64] 561 | os: [linux] 562 | requiresBuild: true 563 | dev: true 564 | optional: true 565 | 566 | /@esbuild/linux-riscv64@0.25.0: 567 | resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} 568 | engines: {node: '>=18'} 569 | cpu: [riscv64] 570 | os: [linux] 571 | requiresBuild: true 572 | dev: true 573 | optional: true 574 | 575 | /@esbuild/linux-s390x@0.25.0: 576 | resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} 577 | engines: {node: '>=18'} 578 | cpu: [s390x] 579 | os: [linux] 580 | requiresBuild: true 581 | dev: true 582 | optional: true 583 | 584 | /@esbuild/linux-x64@0.25.0: 585 | resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} 586 | engines: {node: '>=18'} 587 | cpu: [x64] 588 | os: [linux] 589 | requiresBuild: true 590 | dev: true 591 | optional: true 592 | 593 | /@esbuild/netbsd-arm64@0.25.0: 594 | resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} 595 | engines: {node: '>=18'} 596 | cpu: [arm64] 597 | os: [netbsd] 598 | requiresBuild: true 599 | dev: true 600 | optional: true 601 | 602 | /@esbuild/netbsd-x64@0.25.0: 603 | resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} 604 | engines: {node: '>=18'} 605 | cpu: [x64] 606 | os: [netbsd] 607 | requiresBuild: true 608 | dev: true 609 | optional: true 610 | 611 | /@esbuild/openbsd-arm64@0.25.0: 612 | resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} 613 | engines: {node: '>=18'} 614 | cpu: [arm64] 615 | os: [openbsd] 616 | requiresBuild: true 617 | dev: true 618 | optional: true 619 | 620 | /@esbuild/openbsd-x64@0.25.0: 621 | resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} 622 | engines: {node: '>=18'} 623 | cpu: [x64] 624 | os: [openbsd] 625 | requiresBuild: true 626 | dev: true 627 | optional: true 628 | 629 | /@esbuild/sunos-x64@0.25.0: 630 | resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} 631 | engines: {node: '>=18'} 632 | cpu: [x64] 633 | os: [sunos] 634 | requiresBuild: true 635 | dev: true 636 | optional: true 637 | 638 | /@esbuild/win32-arm64@0.25.0: 639 | resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} 640 | engines: {node: '>=18'} 641 | cpu: [arm64] 642 | os: [win32] 643 | requiresBuild: true 644 | dev: true 645 | optional: true 646 | 647 | /@esbuild/win32-ia32@0.25.0: 648 | resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} 649 | engines: {node: '>=18'} 650 | cpu: [ia32] 651 | os: [win32] 652 | requiresBuild: true 653 | dev: true 654 | optional: true 655 | 656 | /@esbuild/win32-x64@0.25.0: 657 | resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} 658 | engines: {node: '>=18'} 659 | cpu: [x64] 660 | os: [win32] 661 | requiresBuild: true 662 | dev: true 663 | optional: true 664 | 665 | /@isaacs/cliui@8.0.2: 666 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 667 | engines: {node: '>=12'} 668 | dependencies: 669 | string-width: 5.1.2 670 | string-width-cjs: /string-width@4.2.3 671 | strip-ansi: 7.1.0 672 | strip-ansi-cjs: /strip-ansi@6.0.1 673 | wrap-ansi: 8.1.0 674 | wrap-ansi-cjs: /wrap-ansi@7.0.0 675 | dev: true 676 | 677 | /@istanbuljs/load-nyc-config@1.1.0: 678 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 679 | engines: {node: '>=8'} 680 | dependencies: 681 | camelcase: 5.3.1 682 | find-up: 4.1.0 683 | get-package-type: 0.1.0 684 | js-yaml: 3.14.1 685 | resolve-from: 5.0.0 686 | dev: true 687 | 688 | /@istanbuljs/schema@0.1.3: 689 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 690 | engines: {node: '>=8'} 691 | dev: true 692 | 693 | /@jest/console@29.7.0: 694 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 695 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 696 | dependencies: 697 | '@jest/types': 29.6.3 698 | '@types/node': 22.13.8 699 | chalk: 4.1.2 700 | jest-message-util: 29.7.0 701 | jest-util: 29.7.0 702 | slash: 3.0.0 703 | dev: true 704 | 705 | /@jest/core@29.7.0: 706 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 707 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 708 | peerDependencies: 709 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 710 | peerDependenciesMeta: 711 | node-notifier: 712 | optional: true 713 | dependencies: 714 | '@jest/console': 29.7.0 715 | '@jest/reporters': 29.7.0 716 | '@jest/test-result': 29.7.0 717 | '@jest/transform': 29.7.0 718 | '@jest/types': 29.6.3 719 | '@types/node': 22.13.8 720 | ansi-escapes: 4.3.2 721 | chalk: 4.1.2 722 | ci-info: 3.9.0 723 | exit: 0.1.2 724 | graceful-fs: 4.2.11 725 | jest-changed-files: 29.7.0 726 | jest-config: 29.7.0(@types/node@22.13.8) 727 | jest-haste-map: 29.7.0 728 | jest-message-util: 29.7.0 729 | jest-regex-util: 29.6.3 730 | jest-resolve: 29.7.0 731 | jest-resolve-dependencies: 29.7.0 732 | jest-runner: 29.7.0 733 | jest-runtime: 29.7.0 734 | jest-snapshot: 29.7.0 735 | jest-util: 29.7.0 736 | jest-validate: 29.7.0 737 | jest-watcher: 29.7.0 738 | micromatch: 4.0.8 739 | pretty-format: 29.7.0 740 | slash: 3.0.0 741 | strip-ansi: 6.0.1 742 | transitivePeerDependencies: 743 | - babel-plugin-macros 744 | - supports-color 745 | - ts-node 746 | dev: true 747 | 748 | /@jest/environment@29.7.0: 749 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 750 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 751 | dependencies: 752 | '@jest/fake-timers': 29.7.0 753 | '@jest/types': 29.6.3 754 | '@types/node': 22.13.8 755 | jest-mock: 29.7.0 756 | dev: true 757 | 758 | /@jest/expect-utils@29.7.0: 759 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 760 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 761 | dependencies: 762 | jest-get-type: 29.6.3 763 | dev: true 764 | 765 | /@jest/expect@29.7.0: 766 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 767 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 768 | dependencies: 769 | expect: 29.7.0 770 | jest-snapshot: 29.7.0 771 | transitivePeerDependencies: 772 | - supports-color 773 | dev: true 774 | 775 | /@jest/fake-timers@29.7.0: 776 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 777 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 778 | dependencies: 779 | '@jest/types': 29.6.3 780 | '@sinonjs/fake-timers': 10.3.0 781 | '@types/node': 22.13.8 782 | jest-message-util: 29.7.0 783 | jest-mock: 29.7.0 784 | jest-util: 29.7.0 785 | dev: true 786 | 787 | /@jest/globals@29.7.0: 788 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 789 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 790 | dependencies: 791 | '@jest/environment': 29.7.0 792 | '@jest/expect': 29.7.0 793 | '@jest/types': 29.6.3 794 | jest-mock: 29.7.0 795 | transitivePeerDependencies: 796 | - supports-color 797 | dev: true 798 | 799 | /@jest/reporters@29.7.0: 800 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 801 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 802 | peerDependencies: 803 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 804 | peerDependenciesMeta: 805 | node-notifier: 806 | optional: true 807 | dependencies: 808 | '@bcoe/v8-coverage': 0.2.3 809 | '@jest/console': 29.7.0 810 | '@jest/test-result': 29.7.0 811 | '@jest/transform': 29.7.0 812 | '@jest/types': 29.6.3 813 | '@jridgewell/trace-mapping': 0.3.25 814 | '@types/node': 22.13.8 815 | chalk: 4.1.2 816 | collect-v8-coverage: 1.0.2 817 | exit: 0.1.2 818 | glob: 7.2.3 819 | graceful-fs: 4.2.11 820 | istanbul-lib-coverage: 3.2.2 821 | istanbul-lib-instrument: 6.0.3 822 | istanbul-lib-report: 3.0.1 823 | istanbul-lib-source-maps: 4.0.1 824 | istanbul-reports: 3.1.7 825 | jest-message-util: 29.7.0 826 | jest-util: 29.7.0 827 | jest-worker: 29.7.0 828 | slash: 3.0.0 829 | string-length: 4.0.2 830 | strip-ansi: 6.0.1 831 | v8-to-istanbul: 9.3.0 832 | transitivePeerDependencies: 833 | - supports-color 834 | dev: true 835 | 836 | /@jest/schemas@29.6.3: 837 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 838 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 839 | dependencies: 840 | '@sinclair/typebox': 0.27.8 841 | dev: true 842 | 843 | /@jest/source-map@29.6.3: 844 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 845 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 846 | dependencies: 847 | '@jridgewell/trace-mapping': 0.3.25 848 | callsites: 3.1.0 849 | graceful-fs: 4.2.11 850 | dev: true 851 | 852 | /@jest/test-result@29.7.0: 853 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 854 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 855 | dependencies: 856 | '@jest/console': 29.7.0 857 | '@jest/types': 29.6.3 858 | '@types/istanbul-lib-coverage': 2.0.6 859 | collect-v8-coverage: 1.0.2 860 | dev: true 861 | 862 | /@jest/test-sequencer@29.7.0: 863 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 864 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 865 | dependencies: 866 | '@jest/test-result': 29.7.0 867 | graceful-fs: 4.2.11 868 | jest-haste-map: 29.7.0 869 | slash: 3.0.0 870 | dev: true 871 | 872 | /@jest/transform@29.7.0: 873 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 874 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 875 | dependencies: 876 | '@babel/core': 7.26.9 877 | '@jest/types': 29.6.3 878 | '@jridgewell/trace-mapping': 0.3.25 879 | babel-plugin-istanbul: 6.1.1 880 | chalk: 4.1.2 881 | convert-source-map: 2.0.0 882 | fast-json-stable-stringify: 2.1.0 883 | graceful-fs: 4.2.11 884 | jest-haste-map: 29.7.0 885 | jest-regex-util: 29.6.3 886 | jest-util: 29.7.0 887 | micromatch: 4.0.8 888 | pirates: 4.0.6 889 | slash: 3.0.0 890 | write-file-atomic: 4.0.2 891 | transitivePeerDependencies: 892 | - supports-color 893 | dev: true 894 | 895 | /@jest/types@29.6.3: 896 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 897 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 898 | dependencies: 899 | '@jest/schemas': 29.6.3 900 | '@types/istanbul-lib-coverage': 2.0.6 901 | '@types/istanbul-reports': 3.0.4 902 | '@types/node': 22.13.8 903 | '@types/yargs': 17.0.33 904 | chalk: 4.1.2 905 | dev: true 906 | 907 | /@jridgewell/gen-mapping@0.3.8: 908 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 909 | engines: {node: '>=6.0.0'} 910 | dependencies: 911 | '@jridgewell/set-array': 1.2.1 912 | '@jridgewell/sourcemap-codec': 1.5.0 913 | '@jridgewell/trace-mapping': 0.3.25 914 | dev: true 915 | 916 | /@jridgewell/resolve-uri@3.1.2: 917 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 918 | engines: {node: '>=6.0.0'} 919 | dev: true 920 | 921 | /@jridgewell/set-array@1.2.1: 922 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 923 | engines: {node: '>=6.0.0'} 924 | dev: true 925 | 926 | /@jridgewell/source-map@0.3.6: 927 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 928 | dependencies: 929 | '@jridgewell/gen-mapping': 0.3.8 930 | '@jridgewell/trace-mapping': 0.3.25 931 | dev: true 932 | 933 | /@jridgewell/sourcemap-codec@1.5.0: 934 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 935 | dev: true 936 | 937 | /@jridgewell/trace-mapping@0.3.25: 938 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 939 | dependencies: 940 | '@jridgewell/resolve-uri': 3.1.2 941 | '@jridgewell/sourcemap-codec': 1.5.0 942 | dev: true 943 | 944 | /@pkgjs/parseargs@0.11.0: 945 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 946 | engines: {node: '>=14'} 947 | requiresBuild: true 948 | dev: true 949 | optional: true 950 | 951 | /@rollup/plugin-commonjs@25.0.8(rollup@4.34.9): 952 | resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} 953 | engines: {node: '>=14.0.0'} 954 | peerDependencies: 955 | rollup: ^2.68.0||^3.0.0||^4.0.0 956 | peerDependenciesMeta: 957 | rollup: 958 | optional: true 959 | dependencies: 960 | '@rollup/pluginutils': 5.1.4(rollup@4.34.9) 961 | commondir: 1.0.1 962 | estree-walker: 2.0.2 963 | glob: 8.1.0 964 | is-reference: 1.2.1 965 | magic-string: 0.30.17 966 | rollup: 4.34.9 967 | dev: true 968 | 969 | /@rollup/plugin-node-resolve@15.3.1(rollup@4.34.9): 970 | resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} 971 | engines: {node: '>=14.0.0'} 972 | peerDependencies: 973 | rollup: ^2.78.0||^3.0.0||^4.0.0 974 | peerDependenciesMeta: 975 | rollup: 976 | optional: true 977 | dependencies: 978 | '@rollup/pluginutils': 5.1.4(rollup@4.34.9) 979 | '@types/resolve': 1.20.2 980 | deepmerge: 4.3.1 981 | is-module: 1.0.0 982 | resolve: 1.22.10 983 | rollup: 4.34.9 984 | dev: true 985 | 986 | /@rollup/plugin-terser@0.4.4(rollup@4.34.9): 987 | resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 988 | engines: {node: '>=14.0.0'} 989 | peerDependencies: 990 | rollup: ^2.0.0||^3.0.0||^4.0.0 991 | peerDependenciesMeta: 992 | rollup: 993 | optional: true 994 | dependencies: 995 | rollup: 4.34.9 996 | serialize-javascript: 6.0.2 997 | smob: 1.5.0 998 | terser: 5.39.0 999 | dev: true 1000 | 1001 | /@rollup/pluginutils@5.1.4(rollup@4.34.9): 1002 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 1003 | engines: {node: '>=14.0.0'} 1004 | peerDependencies: 1005 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 1006 | peerDependenciesMeta: 1007 | rollup: 1008 | optional: true 1009 | dependencies: 1010 | '@types/estree': 1.0.6 1011 | estree-walker: 2.0.2 1012 | picomatch: 4.0.2 1013 | rollup: 4.34.9 1014 | dev: true 1015 | 1016 | /@rollup/rollup-android-arm-eabi@4.34.9: 1017 | resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} 1018 | cpu: [arm] 1019 | os: [android] 1020 | requiresBuild: true 1021 | dev: true 1022 | optional: true 1023 | 1024 | /@rollup/rollup-android-arm64@4.34.9: 1025 | resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} 1026 | cpu: [arm64] 1027 | os: [android] 1028 | requiresBuild: true 1029 | dev: true 1030 | optional: true 1031 | 1032 | /@rollup/rollup-darwin-arm64@4.34.9: 1033 | resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} 1034 | cpu: [arm64] 1035 | os: [darwin] 1036 | requiresBuild: true 1037 | dev: true 1038 | optional: true 1039 | 1040 | /@rollup/rollup-darwin-x64@4.34.9: 1041 | resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} 1042 | cpu: [x64] 1043 | os: [darwin] 1044 | requiresBuild: true 1045 | dev: true 1046 | optional: true 1047 | 1048 | /@rollup/rollup-freebsd-arm64@4.34.9: 1049 | resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} 1050 | cpu: [arm64] 1051 | os: [freebsd] 1052 | requiresBuild: true 1053 | dev: true 1054 | optional: true 1055 | 1056 | /@rollup/rollup-freebsd-x64@4.34.9: 1057 | resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} 1058 | cpu: [x64] 1059 | os: [freebsd] 1060 | requiresBuild: true 1061 | dev: true 1062 | optional: true 1063 | 1064 | /@rollup/rollup-linux-arm-gnueabihf@4.34.9: 1065 | resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} 1066 | cpu: [arm] 1067 | os: [linux] 1068 | requiresBuild: true 1069 | dev: true 1070 | optional: true 1071 | 1072 | /@rollup/rollup-linux-arm-musleabihf@4.34.9: 1073 | resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} 1074 | cpu: [arm] 1075 | os: [linux] 1076 | requiresBuild: true 1077 | dev: true 1078 | optional: true 1079 | 1080 | /@rollup/rollup-linux-arm64-gnu@4.34.9: 1081 | resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} 1082 | cpu: [arm64] 1083 | os: [linux] 1084 | requiresBuild: true 1085 | dev: true 1086 | optional: true 1087 | 1088 | /@rollup/rollup-linux-arm64-musl@4.34.9: 1089 | resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} 1090 | cpu: [arm64] 1091 | os: [linux] 1092 | requiresBuild: true 1093 | dev: true 1094 | optional: true 1095 | 1096 | /@rollup/rollup-linux-loongarch64-gnu@4.34.9: 1097 | resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} 1098 | cpu: [loong64] 1099 | os: [linux] 1100 | requiresBuild: true 1101 | dev: true 1102 | optional: true 1103 | 1104 | /@rollup/rollup-linux-powerpc64le-gnu@4.34.9: 1105 | resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} 1106 | cpu: [ppc64] 1107 | os: [linux] 1108 | requiresBuild: true 1109 | dev: true 1110 | optional: true 1111 | 1112 | /@rollup/rollup-linux-riscv64-gnu@4.34.9: 1113 | resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} 1114 | cpu: [riscv64] 1115 | os: [linux] 1116 | requiresBuild: true 1117 | dev: true 1118 | optional: true 1119 | 1120 | /@rollup/rollup-linux-s390x-gnu@4.34.9: 1121 | resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} 1122 | cpu: [s390x] 1123 | os: [linux] 1124 | requiresBuild: true 1125 | dev: true 1126 | optional: true 1127 | 1128 | /@rollup/rollup-linux-x64-gnu@4.34.9: 1129 | resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} 1130 | cpu: [x64] 1131 | os: [linux] 1132 | requiresBuild: true 1133 | dev: true 1134 | optional: true 1135 | 1136 | /@rollup/rollup-linux-x64-musl@4.34.9: 1137 | resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} 1138 | cpu: [x64] 1139 | os: [linux] 1140 | requiresBuild: true 1141 | dev: true 1142 | optional: true 1143 | 1144 | /@rollup/rollup-win32-arm64-msvc@4.34.9: 1145 | resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} 1146 | cpu: [arm64] 1147 | os: [win32] 1148 | requiresBuild: true 1149 | dev: true 1150 | optional: true 1151 | 1152 | /@rollup/rollup-win32-ia32-msvc@4.34.9: 1153 | resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} 1154 | cpu: [ia32] 1155 | os: [win32] 1156 | requiresBuild: true 1157 | dev: true 1158 | optional: true 1159 | 1160 | /@rollup/rollup-win32-x64-msvc@4.34.9: 1161 | resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} 1162 | cpu: [x64] 1163 | os: [win32] 1164 | requiresBuild: true 1165 | dev: true 1166 | optional: true 1167 | 1168 | /@sinclair/typebox@0.27.8: 1169 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 1170 | dev: true 1171 | 1172 | /@sinonjs/commons@3.0.1: 1173 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 1174 | dependencies: 1175 | type-detect: 4.0.8 1176 | dev: true 1177 | 1178 | /@sinonjs/fake-timers@10.3.0: 1179 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 1180 | dependencies: 1181 | '@sinonjs/commons': 3.0.1 1182 | dev: true 1183 | 1184 | /@tootallnate/once@2.0.0: 1185 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 1186 | engines: {node: '>= 10'} 1187 | dev: true 1188 | 1189 | /@types/babel__core@7.20.5: 1190 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 1191 | dependencies: 1192 | '@babel/parser': 7.26.9 1193 | '@babel/types': 7.26.9 1194 | '@types/babel__generator': 7.6.8 1195 | '@types/babel__template': 7.4.4 1196 | '@types/babel__traverse': 7.20.6 1197 | dev: true 1198 | 1199 | /@types/babel__generator@7.6.8: 1200 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 1201 | dependencies: 1202 | '@babel/types': 7.26.9 1203 | dev: true 1204 | 1205 | /@types/babel__template@7.4.4: 1206 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 1207 | dependencies: 1208 | '@babel/parser': 7.26.9 1209 | '@babel/types': 7.26.9 1210 | dev: true 1211 | 1212 | /@types/babel__traverse@7.20.6: 1213 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 1214 | dependencies: 1215 | '@babel/types': 7.26.9 1216 | dev: true 1217 | 1218 | /@types/detect-node@2.0.2: 1219 | resolution: {integrity: sha512-2r16DIvQ3dLcRHBPzbdlPsqUWvNaIE7g3fPlGcoA5IF0Nvv7gaONWleB2rhEmggvj/P5VvxseWchR2noncrgGg==} 1220 | dev: true 1221 | 1222 | /@types/estree@1.0.6: 1223 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 1224 | dev: true 1225 | 1226 | /@types/graceful-fs@4.1.9: 1227 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 1228 | dependencies: 1229 | '@types/node': 22.13.8 1230 | dev: true 1231 | 1232 | /@types/istanbul-lib-coverage@2.0.6: 1233 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 1234 | dev: true 1235 | 1236 | /@types/istanbul-lib-report@3.0.3: 1237 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 1238 | dependencies: 1239 | '@types/istanbul-lib-coverage': 2.0.6 1240 | dev: true 1241 | 1242 | /@types/istanbul-reports@3.0.4: 1243 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 1244 | dependencies: 1245 | '@types/istanbul-lib-report': 3.0.3 1246 | dev: true 1247 | 1248 | /@types/jest@29.5.14: 1249 | resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} 1250 | dependencies: 1251 | expect: 29.7.0 1252 | pretty-format: 29.7.0 1253 | dev: true 1254 | 1255 | /@types/jsdom@20.0.1: 1256 | resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} 1257 | dependencies: 1258 | '@types/node': 22.13.8 1259 | '@types/tough-cookie': 4.0.5 1260 | parse5: 7.2.1 1261 | dev: true 1262 | 1263 | /@types/node@22.13.8: 1264 | resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==} 1265 | dependencies: 1266 | undici-types: 6.20.0 1267 | dev: true 1268 | 1269 | /@types/resolve@1.20.2: 1270 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 1271 | dev: true 1272 | 1273 | /@types/stack-utils@2.0.3: 1274 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 1275 | dev: true 1276 | 1277 | /@types/tough-cookie@4.0.5: 1278 | resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} 1279 | dev: true 1280 | 1281 | /@types/yargs-parser@21.0.3: 1282 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 1283 | dev: true 1284 | 1285 | /@types/yargs@17.0.33: 1286 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 1287 | dependencies: 1288 | '@types/yargs-parser': 21.0.3 1289 | dev: true 1290 | 1291 | /abab@2.0.6: 1292 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 1293 | deprecated: Use your platform's native atob() and btoa() methods instead 1294 | dev: true 1295 | 1296 | /acorn-globals@7.0.1: 1297 | resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} 1298 | dependencies: 1299 | acorn: 8.14.0 1300 | acorn-walk: 8.3.4 1301 | dev: true 1302 | 1303 | /acorn-walk@8.3.4: 1304 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 1305 | engines: {node: '>=0.4.0'} 1306 | dependencies: 1307 | acorn: 8.14.0 1308 | dev: true 1309 | 1310 | /acorn@8.14.0: 1311 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 1312 | engines: {node: '>=0.4.0'} 1313 | hasBin: true 1314 | dev: true 1315 | 1316 | /agent-base@6.0.2: 1317 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 1318 | engines: {node: '>= 6.0.0'} 1319 | dependencies: 1320 | debug: 4.4.0 1321 | transitivePeerDependencies: 1322 | - supports-color 1323 | dev: true 1324 | 1325 | /ansi-escapes@4.3.2: 1326 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 1327 | engines: {node: '>=8'} 1328 | dependencies: 1329 | type-fest: 0.21.3 1330 | dev: true 1331 | 1332 | /ansi-regex@5.0.1: 1333 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1334 | engines: {node: '>=8'} 1335 | dev: true 1336 | 1337 | /ansi-regex@6.1.0: 1338 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 1339 | engines: {node: '>=12'} 1340 | dev: true 1341 | 1342 | /ansi-styles@4.3.0: 1343 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1344 | engines: {node: '>=8'} 1345 | dependencies: 1346 | color-convert: 2.0.1 1347 | dev: true 1348 | 1349 | /ansi-styles@5.2.0: 1350 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 1351 | engines: {node: '>=10'} 1352 | dev: true 1353 | 1354 | /ansi-styles@6.2.1: 1355 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1356 | engines: {node: '>=12'} 1357 | dev: true 1358 | 1359 | /anymatch@3.1.3: 1360 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1361 | engines: {node: '>= 8'} 1362 | dependencies: 1363 | normalize-path: 3.0.0 1364 | picomatch: 2.3.1 1365 | dev: true 1366 | 1367 | /argparse@1.0.10: 1368 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 1369 | dependencies: 1370 | sprintf-js: 1.0.3 1371 | dev: true 1372 | 1373 | /async@3.2.6: 1374 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 1375 | dev: true 1376 | 1377 | /asynckit@0.4.0: 1378 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 1379 | dev: true 1380 | 1381 | /babel-jest@29.7.0(@babel/core@7.26.9): 1382 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 1383 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1384 | peerDependencies: 1385 | '@babel/core': ^7.8.0 1386 | dependencies: 1387 | '@babel/core': 7.26.9 1388 | '@jest/transform': 29.7.0 1389 | '@types/babel__core': 7.20.5 1390 | babel-plugin-istanbul: 6.1.1 1391 | babel-preset-jest: 29.6.3(@babel/core@7.26.9) 1392 | chalk: 4.1.2 1393 | graceful-fs: 4.2.11 1394 | slash: 3.0.0 1395 | transitivePeerDependencies: 1396 | - supports-color 1397 | dev: true 1398 | 1399 | /babel-plugin-istanbul@6.1.1: 1400 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 1401 | engines: {node: '>=8'} 1402 | dependencies: 1403 | '@babel/helper-plugin-utils': 7.26.5 1404 | '@istanbuljs/load-nyc-config': 1.1.0 1405 | '@istanbuljs/schema': 0.1.3 1406 | istanbul-lib-instrument: 5.2.1 1407 | test-exclude: 6.0.0 1408 | transitivePeerDependencies: 1409 | - supports-color 1410 | dev: true 1411 | 1412 | /babel-plugin-jest-hoist@29.6.3: 1413 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 1414 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1415 | dependencies: 1416 | '@babel/template': 7.26.9 1417 | '@babel/types': 7.26.9 1418 | '@types/babel__core': 7.20.5 1419 | '@types/babel__traverse': 7.20.6 1420 | dev: true 1421 | 1422 | /babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.9): 1423 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 1424 | peerDependencies: 1425 | '@babel/core': ^7.0.0 1426 | dependencies: 1427 | '@babel/core': 7.26.9 1428 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.9) 1429 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.9) 1430 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.9) 1431 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.9) 1432 | '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) 1433 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) 1434 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.9) 1435 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.9) 1436 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) 1437 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) 1438 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.9) 1439 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) 1440 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) 1441 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.9) 1442 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.9) 1443 | dev: true 1444 | 1445 | /babel-preset-jest@29.6.3(@babel/core@7.26.9): 1446 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 1447 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1448 | peerDependencies: 1449 | '@babel/core': ^7.0.0 1450 | dependencies: 1451 | '@babel/core': 7.26.9 1452 | babel-plugin-jest-hoist: 29.6.3 1453 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) 1454 | dev: true 1455 | 1456 | /balanced-match@1.0.2: 1457 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1458 | dev: true 1459 | 1460 | /brace-expansion@1.1.11: 1461 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1462 | dependencies: 1463 | balanced-match: 1.0.2 1464 | concat-map: 0.0.1 1465 | dev: true 1466 | 1467 | /brace-expansion@2.0.1: 1468 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1469 | dependencies: 1470 | balanced-match: 1.0.2 1471 | dev: true 1472 | 1473 | /braces@3.0.3: 1474 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 1475 | engines: {node: '>=8'} 1476 | dependencies: 1477 | fill-range: 7.1.1 1478 | dev: true 1479 | 1480 | /browserslist@4.24.4: 1481 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 1482 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1483 | hasBin: true 1484 | dependencies: 1485 | caniuse-lite: 1.0.30001701 1486 | electron-to-chromium: 1.5.109 1487 | node-releases: 2.0.19 1488 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 1489 | dev: true 1490 | 1491 | /bs-logger@0.2.6: 1492 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 1493 | engines: {node: '>= 6'} 1494 | dependencies: 1495 | fast-json-stable-stringify: 2.1.0 1496 | dev: true 1497 | 1498 | /bser@2.1.1: 1499 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 1500 | dependencies: 1501 | node-int64: 0.4.0 1502 | dev: true 1503 | 1504 | /buffer-from@1.1.2: 1505 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1506 | dev: true 1507 | 1508 | /call-bind-apply-helpers@1.0.2: 1509 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 1510 | engines: {node: '>= 0.4'} 1511 | dependencies: 1512 | es-errors: 1.3.0 1513 | function-bind: 1.1.2 1514 | dev: true 1515 | 1516 | /callsites@3.1.0: 1517 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1518 | engines: {node: '>=6'} 1519 | dev: true 1520 | 1521 | /camelcase@5.3.1: 1522 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 1523 | engines: {node: '>=6'} 1524 | dev: true 1525 | 1526 | /camelcase@6.3.0: 1527 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1528 | engines: {node: '>=10'} 1529 | dev: true 1530 | 1531 | /caniuse-lite@1.0.30001701: 1532 | resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} 1533 | dev: true 1534 | 1535 | /cbor-extract@2.2.0: 1536 | resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} 1537 | hasBin: true 1538 | requiresBuild: true 1539 | dependencies: 1540 | node-gyp-build-optional-packages: 5.1.1 1541 | optionalDependencies: 1542 | '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 1543 | '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 1544 | '@cbor-extract/cbor-extract-linux-arm': 2.2.0 1545 | '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 1546 | '@cbor-extract/cbor-extract-linux-x64': 2.2.0 1547 | '@cbor-extract/cbor-extract-win32-x64': 2.2.0 1548 | dev: false 1549 | optional: true 1550 | 1551 | /cbor-x@1.6.0: 1552 | resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} 1553 | optionalDependencies: 1554 | cbor-extract: 2.2.0 1555 | dev: false 1556 | 1557 | /chalk@4.1.2: 1558 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1559 | engines: {node: '>=10'} 1560 | dependencies: 1561 | ansi-styles: 4.3.0 1562 | supports-color: 7.2.0 1563 | dev: true 1564 | 1565 | /char-regex@1.0.2: 1566 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 1567 | engines: {node: '>=10'} 1568 | dev: true 1569 | 1570 | /ci-info@3.9.0: 1571 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 1572 | engines: {node: '>=8'} 1573 | dev: true 1574 | 1575 | /cjs-module-lexer@1.4.3: 1576 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 1577 | dev: true 1578 | 1579 | /cliui@8.0.1: 1580 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1581 | engines: {node: '>=12'} 1582 | dependencies: 1583 | string-width: 4.2.3 1584 | strip-ansi: 6.0.1 1585 | wrap-ansi: 7.0.0 1586 | dev: true 1587 | 1588 | /co@4.6.0: 1589 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 1590 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 1591 | dev: true 1592 | 1593 | /collect-v8-coverage@1.0.2: 1594 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 1595 | dev: true 1596 | 1597 | /color-convert@2.0.1: 1598 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1599 | engines: {node: '>=7.0.0'} 1600 | dependencies: 1601 | color-name: 1.1.4 1602 | dev: true 1603 | 1604 | /color-name@1.1.4: 1605 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1606 | dev: true 1607 | 1608 | /combined-stream@1.0.8: 1609 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1610 | engines: {node: '>= 0.8'} 1611 | dependencies: 1612 | delayed-stream: 1.0.0 1613 | dev: true 1614 | 1615 | /commander@2.20.3: 1616 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1617 | dev: true 1618 | 1619 | /commondir@1.0.1: 1620 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 1621 | dev: true 1622 | 1623 | /concat-map@0.0.1: 1624 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1625 | dev: true 1626 | 1627 | /convert-source-map@2.0.0: 1628 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1629 | dev: true 1630 | 1631 | /create-jest@29.7.0(@types/node@22.13.8): 1632 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 1633 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1634 | hasBin: true 1635 | dependencies: 1636 | '@jest/types': 29.6.3 1637 | chalk: 4.1.2 1638 | exit: 0.1.2 1639 | graceful-fs: 4.2.11 1640 | jest-config: 29.7.0(@types/node@22.13.8) 1641 | jest-util: 29.7.0 1642 | prompts: 2.4.2 1643 | transitivePeerDependencies: 1644 | - '@types/node' 1645 | - babel-plugin-macros 1646 | - supports-color 1647 | - ts-node 1648 | dev: true 1649 | 1650 | /cross-spawn@7.0.6: 1651 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1652 | engines: {node: '>= 8'} 1653 | dependencies: 1654 | path-key: 3.1.1 1655 | shebang-command: 2.0.0 1656 | which: 2.0.2 1657 | dev: true 1658 | 1659 | /cssom@0.3.8: 1660 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 1661 | dev: true 1662 | 1663 | /cssom@0.5.0: 1664 | resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 1665 | dev: true 1666 | 1667 | /cssstyle@2.3.0: 1668 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 1669 | engines: {node: '>=8'} 1670 | dependencies: 1671 | cssom: 0.3.8 1672 | dev: true 1673 | 1674 | /data-urls@3.0.2: 1675 | resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} 1676 | engines: {node: '>=12'} 1677 | dependencies: 1678 | abab: 2.0.6 1679 | whatwg-mimetype: 3.0.0 1680 | whatwg-url: 11.0.0 1681 | dev: true 1682 | 1683 | /debug@4.4.0: 1684 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 1685 | engines: {node: '>=6.0'} 1686 | peerDependencies: 1687 | supports-color: '*' 1688 | peerDependenciesMeta: 1689 | supports-color: 1690 | optional: true 1691 | dependencies: 1692 | ms: 2.1.3 1693 | dev: true 1694 | 1695 | /decimal.js@10.5.0: 1696 | resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} 1697 | dev: true 1698 | 1699 | /dedent@1.5.3: 1700 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 1701 | peerDependencies: 1702 | babel-plugin-macros: ^3.1.0 1703 | peerDependenciesMeta: 1704 | babel-plugin-macros: 1705 | optional: true 1706 | dev: true 1707 | 1708 | /deepmerge@4.3.1: 1709 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1710 | engines: {node: '>=0.10.0'} 1711 | dev: true 1712 | 1713 | /delayed-stream@1.0.0: 1714 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1715 | engines: {node: '>=0.4.0'} 1716 | dev: true 1717 | 1718 | /detect-libc@2.0.3: 1719 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 1720 | engines: {node: '>=8'} 1721 | requiresBuild: true 1722 | dev: false 1723 | optional: true 1724 | 1725 | /detect-newline@3.1.0: 1726 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1727 | engines: {node: '>=8'} 1728 | dev: true 1729 | 1730 | /detect-node@2.1.0: 1731 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} 1732 | dev: false 1733 | 1734 | /diff-sequences@29.6.3: 1735 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 1736 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1737 | dev: true 1738 | 1739 | /domexception@4.0.0: 1740 | resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} 1741 | engines: {node: '>=12'} 1742 | deprecated: Use your platform's native DOMException instead 1743 | dependencies: 1744 | webidl-conversions: 7.0.0 1745 | dev: true 1746 | 1747 | /dunder-proto@1.0.1: 1748 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 1749 | engines: {node: '>= 0.4'} 1750 | dependencies: 1751 | call-bind-apply-helpers: 1.0.2 1752 | es-errors: 1.3.0 1753 | gopd: 1.2.0 1754 | dev: true 1755 | 1756 | /eastasianwidth@0.2.0: 1757 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1758 | dev: true 1759 | 1760 | /ejs@3.1.10: 1761 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 1762 | engines: {node: '>=0.10.0'} 1763 | hasBin: true 1764 | dependencies: 1765 | jake: 10.9.2 1766 | dev: true 1767 | 1768 | /electron-to-chromium@1.5.109: 1769 | resolution: {integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==} 1770 | dev: true 1771 | 1772 | /emittery@0.13.1: 1773 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 1774 | engines: {node: '>=12'} 1775 | dev: true 1776 | 1777 | /emoji-regex@8.0.0: 1778 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1779 | dev: true 1780 | 1781 | /emoji-regex@9.2.2: 1782 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1783 | dev: true 1784 | 1785 | /entities@4.5.0: 1786 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1787 | engines: {node: '>=0.12'} 1788 | dev: true 1789 | 1790 | /error-ex@1.3.2: 1791 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1792 | dependencies: 1793 | is-arrayish: 0.2.1 1794 | dev: true 1795 | 1796 | /es-define-property@1.0.1: 1797 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 1798 | engines: {node: '>= 0.4'} 1799 | dev: true 1800 | 1801 | /es-errors@1.3.0: 1802 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 1803 | engines: {node: '>= 0.4'} 1804 | dev: true 1805 | 1806 | /es-module-lexer@1.6.0: 1807 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 1808 | dev: true 1809 | 1810 | /es-object-atoms@1.1.1: 1811 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 1812 | engines: {node: '>= 0.4'} 1813 | dependencies: 1814 | es-errors: 1.3.0 1815 | dev: true 1816 | 1817 | /es-set-tostringtag@2.1.0: 1818 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 1819 | engines: {node: '>= 0.4'} 1820 | dependencies: 1821 | es-errors: 1.3.0 1822 | get-intrinsic: 1.3.0 1823 | has-tostringtag: 1.0.2 1824 | hasown: 2.0.2 1825 | dev: true 1826 | 1827 | /esbuild@0.25.0: 1828 | resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} 1829 | engines: {node: '>=18'} 1830 | hasBin: true 1831 | requiresBuild: true 1832 | optionalDependencies: 1833 | '@esbuild/aix-ppc64': 0.25.0 1834 | '@esbuild/android-arm': 0.25.0 1835 | '@esbuild/android-arm64': 0.25.0 1836 | '@esbuild/android-x64': 0.25.0 1837 | '@esbuild/darwin-arm64': 0.25.0 1838 | '@esbuild/darwin-x64': 0.25.0 1839 | '@esbuild/freebsd-arm64': 0.25.0 1840 | '@esbuild/freebsd-x64': 0.25.0 1841 | '@esbuild/linux-arm': 0.25.0 1842 | '@esbuild/linux-arm64': 0.25.0 1843 | '@esbuild/linux-ia32': 0.25.0 1844 | '@esbuild/linux-loong64': 0.25.0 1845 | '@esbuild/linux-mips64el': 0.25.0 1846 | '@esbuild/linux-ppc64': 0.25.0 1847 | '@esbuild/linux-riscv64': 0.25.0 1848 | '@esbuild/linux-s390x': 0.25.0 1849 | '@esbuild/linux-x64': 0.25.0 1850 | '@esbuild/netbsd-arm64': 0.25.0 1851 | '@esbuild/netbsd-x64': 0.25.0 1852 | '@esbuild/openbsd-arm64': 0.25.0 1853 | '@esbuild/openbsd-x64': 0.25.0 1854 | '@esbuild/sunos-x64': 0.25.0 1855 | '@esbuild/win32-arm64': 0.25.0 1856 | '@esbuild/win32-ia32': 0.25.0 1857 | '@esbuild/win32-x64': 0.25.0 1858 | dev: true 1859 | 1860 | /escalade@3.2.0: 1861 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1862 | engines: {node: '>=6'} 1863 | dev: true 1864 | 1865 | /escape-string-regexp@2.0.0: 1866 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1867 | engines: {node: '>=8'} 1868 | dev: true 1869 | 1870 | /escodegen@2.1.0: 1871 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 1872 | engines: {node: '>=6.0'} 1873 | hasBin: true 1874 | dependencies: 1875 | esprima: 4.0.1 1876 | estraverse: 5.3.0 1877 | esutils: 2.0.3 1878 | optionalDependencies: 1879 | source-map: 0.6.1 1880 | dev: true 1881 | 1882 | /esprima@4.0.1: 1883 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1884 | engines: {node: '>=4'} 1885 | hasBin: true 1886 | dev: true 1887 | 1888 | /estraverse@5.3.0: 1889 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1890 | engines: {node: '>=4.0'} 1891 | dev: true 1892 | 1893 | /estree-walker@2.0.2: 1894 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1895 | dev: true 1896 | 1897 | /esutils@2.0.3: 1898 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1899 | engines: {node: '>=0.10.0'} 1900 | dev: true 1901 | 1902 | /execa@5.1.1: 1903 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1904 | engines: {node: '>=10'} 1905 | dependencies: 1906 | cross-spawn: 7.0.6 1907 | get-stream: 6.0.1 1908 | human-signals: 2.1.0 1909 | is-stream: 2.0.1 1910 | merge-stream: 2.0.0 1911 | npm-run-path: 4.0.1 1912 | onetime: 5.1.2 1913 | signal-exit: 3.0.7 1914 | strip-final-newline: 2.0.0 1915 | dev: true 1916 | 1917 | /exit@0.1.2: 1918 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 1919 | engines: {node: '>= 0.8.0'} 1920 | dev: true 1921 | 1922 | /expect@29.7.0: 1923 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 1924 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1925 | dependencies: 1926 | '@jest/expect-utils': 29.7.0 1927 | jest-get-type: 29.6.3 1928 | jest-matcher-utils: 29.7.0 1929 | jest-message-util: 29.7.0 1930 | jest-util: 29.7.0 1931 | dev: true 1932 | 1933 | /fast-json-stable-stringify@2.1.0: 1934 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1935 | dev: true 1936 | 1937 | /fb-watchman@2.0.2: 1938 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 1939 | dependencies: 1940 | bser: 2.1.1 1941 | dev: true 1942 | 1943 | /filelist@1.0.4: 1944 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 1945 | dependencies: 1946 | minimatch: 5.1.6 1947 | dev: true 1948 | 1949 | /fill-range@7.1.1: 1950 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1951 | engines: {node: '>=8'} 1952 | dependencies: 1953 | to-regex-range: 5.0.1 1954 | dev: true 1955 | 1956 | /find-up@4.1.0: 1957 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1958 | engines: {node: '>=8'} 1959 | dependencies: 1960 | locate-path: 5.0.0 1961 | path-exists: 4.0.0 1962 | dev: true 1963 | 1964 | /foreground-child@3.3.1: 1965 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 1966 | engines: {node: '>=14'} 1967 | dependencies: 1968 | cross-spawn: 7.0.6 1969 | signal-exit: 4.1.0 1970 | dev: true 1971 | 1972 | /form-data@4.0.2: 1973 | resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} 1974 | engines: {node: '>= 6'} 1975 | dependencies: 1976 | asynckit: 0.4.0 1977 | combined-stream: 1.0.8 1978 | es-set-tostringtag: 2.1.0 1979 | mime-types: 2.1.35 1980 | dev: true 1981 | 1982 | /fs.realpath@1.0.0: 1983 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1984 | dev: true 1985 | 1986 | /fsevents@2.3.3: 1987 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1988 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1989 | os: [darwin] 1990 | requiresBuild: true 1991 | dev: true 1992 | optional: true 1993 | 1994 | /function-bind@1.1.2: 1995 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1996 | dev: true 1997 | 1998 | /gensync@1.0.0-beta.2: 1999 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 2000 | engines: {node: '>=6.9.0'} 2001 | dev: true 2002 | 2003 | /get-caller-file@2.0.5: 2004 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 2005 | engines: {node: 6.* || 8.* || >= 10.*} 2006 | dev: true 2007 | 2008 | /get-intrinsic@1.3.0: 2009 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 2010 | engines: {node: '>= 0.4'} 2011 | dependencies: 2012 | call-bind-apply-helpers: 1.0.2 2013 | es-define-property: 1.0.1 2014 | es-errors: 1.3.0 2015 | es-object-atoms: 1.1.1 2016 | function-bind: 1.1.2 2017 | get-proto: 1.0.1 2018 | gopd: 1.2.0 2019 | has-symbols: 1.1.0 2020 | hasown: 2.0.2 2021 | math-intrinsics: 1.1.0 2022 | dev: true 2023 | 2024 | /get-package-type@0.1.0: 2025 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 2026 | engines: {node: '>=8.0.0'} 2027 | dev: true 2028 | 2029 | /get-proto@1.0.1: 2030 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 2031 | engines: {node: '>= 0.4'} 2032 | dependencies: 2033 | dunder-proto: 1.0.1 2034 | es-object-atoms: 1.1.1 2035 | dev: true 2036 | 2037 | /get-stream@6.0.1: 2038 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 2039 | engines: {node: '>=10'} 2040 | dev: true 2041 | 2042 | /get-tsconfig@4.10.0: 2043 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 2044 | dependencies: 2045 | resolve-pkg-maps: 1.0.0 2046 | dev: true 2047 | 2048 | /glob@10.4.5: 2049 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 2050 | hasBin: true 2051 | dependencies: 2052 | foreground-child: 3.3.1 2053 | jackspeak: 3.4.3 2054 | minimatch: 9.0.5 2055 | minipass: 7.1.2 2056 | package-json-from-dist: 1.0.1 2057 | path-scurry: 1.11.1 2058 | dev: true 2059 | 2060 | /glob@7.2.3: 2061 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 2062 | deprecated: Glob versions prior to v9 are no longer supported 2063 | dependencies: 2064 | fs.realpath: 1.0.0 2065 | inflight: 1.0.6 2066 | inherits: 2.0.4 2067 | minimatch: 3.1.2 2068 | once: 1.4.0 2069 | path-is-absolute: 1.0.1 2070 | dev: true 2071 | 2072 | /glob@8.1.0: 2073 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 2074 | engines: {node: '>=12'} 2075 | deprecated: Glob versions prior to v9 are no longer supported 2076 | dependencies: 2077 | fs.realpath: 1.0.0 2078 | inflight: 1.0.6 2079 | inherits: 2.0.4 2080 | minimatch: 5.1.6 2081 | once: 1.4.0 2082 | dev: true 2083 | 2084 | /globals@11.12.0: 2085 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 2086 | engines: {node: '>=4'} 2087 | dev: true 2088 | 2089 | /gopd@1.2.0: 2090 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 2091 | engines: {node: '>= 0.4'} 2092 | dev: true 2093 | 2094 | /graceful-fs@4.2.11: 2095 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 2096 | dev: true 2097 | 2098 | /has-flag@4.0.0: 2099 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 2100 | engines: {node: '>=8'} 2101 | dev: true 2102 | 2103 | /has-symbols@1.1.0: 2104 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 2105 | engines: {node: '>= 0.4'} 2106 | dev: true 2107 | 2108 | /has-tostringtag@1.0.2: 2109 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 2110 | engines: {node: '>= 0.4'} 2111 | dependencies: 2112 | has-symbols: 1.1.0 2113 | dev: true 2114 | 2115 | /hasown@2.0.2: 2116 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 2117 | engines: {node: '>= 0.4'} 2118 | dependencies: 2119 | function-bind: 1.1.2 2120 | dev: true 2121 | 2122 | /html-encoding-sniffer@3.0.0: 2123 | resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} 2124 | engines: {node: '>=12'} 2125 | dependencies: 2126 | whatwg-encoding: 2.0.0 2127 | dev: true 2128 | 2129 | /html-escaper@2.0.2: 2130 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 2131 | dev: true 2132 | 2133 | /http-proxy-agent@5.0.0: 2134 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} 2135 | engines: {node: '>= 6'} 2136 | dependencies: 2137 | '@tootallnate/once': 2.0.0 2138 | agent-base: 6.0.2 2139 | debug: 4.4.0 2140 | transitivePeerDependencies: 2141 | - supports-color 2142 | dev: true 2143 | 2144 | /https-proxy-agent@5.0.1: 2145 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 2146 | engines: {node: '>= 6'} 2147 | dependencies: 2148 | agent-base: 6.0.2 2149 | debug: 4.4.0 2150 | transitivePeerDependencies: 2151 | - supports-color 2152 | dev: true 2153 | 2154 | /human-signals@2.1.0: 2155 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 2156 | engines: {node: '>=10.17.0'} 2157 | dev: true 2158 | 2159 | /iconv-lite@0.6.3: 2160 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 2161 | engines: {node: '>=0.10.0'} 2162 | dependencies: 2163 | safer-buffer: 2.1.2 2164 | dev: true 2165 | 2166 | /import-local@3.2.0: 2167 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 2168 | engines: {node: '>=8'} 2169 | hasBin: true 2170 | dependencies: 2171 | pkg-dir: 4.2.0 2172 | resolve-cwd: 3.0.0 2173 | dev: true 2174 | 2175 | /imurmurhash@0.1.4: 2176 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 2177 | engines: {node: '>=0.8.19'} 2178 | dev: true 2179 | 2180 | /inflight@1.0.6: 2181 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 2182 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 2183 | dependencies: 2184 | once: 1.4.0 2185 | wrappy: 1.0.2 2186 | dev: true 2187 | 2188 | /inherits@2.0.4: 2189 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2190 | dev: true 2191 | 2192 | /is-arrayish@0.2.1: 2193 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 2194 | dev: true 2195 | 2196 | /is-core-module@2.16.1: 2197 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 2198 | engines: {node: '>= 0.4'} 2199 | dependencies: 2200 | hasown: 2.0.2 2201 | dev: true 2202 | 2203 | /is-fullwidth-code-point@3.0.0: 2204 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 2205 | engines: {node: '>=8'} 2206 | dev: true 2207 | 2208 | /is-generator-fn@2.1.0: 2209 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 2210 | engines: {node: '>=6'} 2211 | dev: true 2212 | 2213 | /is-module@1.0.0: 2214 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 2215 | dev: true 2216 | 2217 | /is-number@7.0.0: 2218 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2219 | engines: {node: '>=0.12.0'} 2220 | dev: true 2221 | 2222 | /is-potential-custom-element-name@1.0.1: 2223 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 2224 | dev: true 2225 | 2226 | /is-reference@1.2.1: 2227 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 2228 | dependencies: 2229 | '@types/estree': 1.0.6 2230 | dev: true 2231 | 2232 | /is-stream@2.0.1: 2233 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 2234 | engines: {node: '>=8'} 2235 | dev: true 2236 | 2237 | /isexe@2.0.0: 2238 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2239 | dev: true 2240 | 2241 | /istanbul-lib-coverage@3.2.2: 2242 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 2243 | engines: {node: '>=8'} 2244 | dev: true 2245 | 2246 | /istanbul-lib-instrument@5.2.1: 2247 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 2248 | engines: {node: '>=8'} 2249 | dependencies: 2250 | '@babel/core': 7.26.9 2251 | '@babel/parser': 7.26.9 2252 | '@istanbuljs/schema': 0.1.3 2253 | istanbul-lib-coverage: 3.2.2 2254 | semver: 6.3.1 2255 | transitivePeerDependencies: 2256 | - supports-color 2257 | dev: true 2258 | 2259 | /istanbul-lib-instrument@6.0.3: 2260 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 2261 | engines: {node: '>=10'} 2262 | dependencies: 2263 | '@babel/core': 7.26.9 2264 | '@babel/parser': 7.26.9 2265 | '@istanbuljs/schema': 0.1.3 2266 | istanbul-lib-coverage: 3.2.2 2267 | semver: 7.7.1 2268 | transitivePeerDependencies: 2269 | - supports-color 2270 | dev: true 2271 | 2272 | /istanbul-lib-report@3.0.1: 2273 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 2274 | engines: {node: '>=10'} 2275 | dependencies: 2276 | istanbul-lib-coverage: 3.2.2 2277 | make-dir: 4.0.0 2278 | supports-color: 7.2.0 2279 | dev: true 2280 | 2281 | /istanbul-lib-source-maps@4.0.1: 2282 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 2283 | engines: {node: '>=10'} 2284 | dependencies: 2285 | debug: 4.4.0 2286 | istanbul-lib-coverage: 3.2.2 2287 | source-map: 0.6.1 2288 | transitivePeerDependencies: 2289 | - supports-color 2290 | dev: true 2291 | 2292 | /istanbul-reports@3.1.7: 2293 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 2294 | engines: {node: '>=8'} 2295 | dependencies: 2296 | html-escaper: 2.0.2 2297 | istanbul-lib-report: 3.0.1 2298 | dev: true 2299 | 2300 | /jackspeak@3.4.3: 2301 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 2302 | dependencies: 2303 | '@isaacs/cliui': 8.0.2 2304 | optionalDependencies: 2305 | '@pkgjs/parseargs': 0.11.0 2306 | dev: true 2307 | 2308 | /jake@10.9.2: 2309 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 2310 | engines: {node: '>=10'} 2311 | hasBin: true 2312 | dependencies: 2313 | async: 3.2.6 2314 | chalk: 4.1.2 2315 | filelist: 1.0.4 2316 | minimatch: 3.1.2 2317 | dev: true 2318 | 2319 | /jest-changed-files@29.7.0: 2320 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 2321 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2322 | dependencies: 2323 | execa: 5.1.1 2324 | jest-util: 29.7.0 2325 | p-limit: 3.1.0 2326 | dev: true 2327 | 2328 | /jest-circus@29.7.0: 2329 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 2330 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2331 | dependencies: 2332 | '@jest/environment': 29.7.0 2333 | '@jest/expect': 29.7.0 2334 | '@jest/test-result': 29.7.0 2335 | '@jest/types': 29.6.3 2336 | '@types/node': 22.13.8 2337 | chalk: 4.1.2 2338 | co: 4.6.0 2339 | dedent: 1.5.3 2340 | is-generator-fn: 2.1.0 2341 | jest-each: 29.7.0 2342 | jest-matcher-utils: 29.7.0 2343 | jest-message-util: 29.7.0 2344 | jest-runtime: 29.7.0 2345 | jest-snapshot: 29.7.0 2346 | jest-util: 29.7.0 2347 | p-limit: 3.1.0 2348 | pretty-format: 29.7.0 2349 | pure-rand: 6.1.0 2350 | slash: 3.0.0 2351 | stack-utils: 2.0.6 2352 | transitivePeerDependencies: 2353 | - babel-plugin-macros 2354 | - supports-color 2355 | dev: true 2356 | 2357 | /jest-cli@29.7.0(@types/node@22.13.8): 2358 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 2359 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2360 | hasBin: true 2361 | peerDependencies: 2362 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2363 | peerDependenciesMeta: 2364 | node-notifier: 2365 | optional: true 2366 | dependencies: 2367 | '@jest/core': 29.7.0 2368 | '@jest/test-result': 29.7.0 2369 | '@jest/types': 29.6.3 2370 | chalk: 4.1.2 2371 | create-jest: 29.7.0(@types/node@22.13.8) 2372 | exit: 0.1.2 2373 | import-local: 3.2.0 2374 | jest-config: 29.7.0(@types/node@22.13.8) 2375 | jest-util: 29.7.0 2376 | jest-validate: 29.7.0 2377 | yargs: 17.7.2 2378 | transitivePeerDependencies: 2379 | - '@types/node' 2380 | - babel-plugin-macros 2381 | - supports-color 2382 | - ts-node 2383 | dev: true 2384 | 2385 | /jest-config@29.7.0(@types/node@22.13.8): 2386 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 2387 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2388 | peerDependencies: 2389 | '@types/node': '*' 2390 | ts-node: '>=9.0.0' 2391 | peerDependenciesMeta: 2392 | '@types/node': 2393 | optional: true 2394 | ts-node: 2395 | optional: true 2396 | dependencies: 2397 | '@babel/core': 7.26.9 2398 | '@jest/test-sequencer': 29.7.0 2399 | '@jest/types': 29.6.3 2400 | '@types/node': 22.13.8 2401 | babel-jest: 29.7.0(@babel/core@7.26.9) 2402 | chalk: 4.1.2 2403 | ci-info: 3.9.0 2404 | deepmerge: 4.3.1 2405 | glob: 7.2.3 2406 | graceful-fs: 4.2.11 2407 | jest-circus: 29.7.0 2408 | jest-environment-node: 29.7.0 2409 | jest-get-type: 29.6.3 2410 | jest-regex-util: 29.6.3 2411 | jest-resolve: 29.7.0 2412 | jest-runner: 29.7.0 2413 | jest-util: 29.7.0 2414 | jest-validate: 29.7.0 2415 | micromatch: 4.0.8 2416 | parse-json: 5.2.0 2417 | pretty-format: 29.7.0 2418 | slash: 3.0.0 2419 | strip-json-comments: 3.1.1 2420 | transitivePeerDependencies: 2421 | - babel-plugin-macros 2422 | - supports-color 2423 | dev: true 2424 | 2425 | /jest-diff@29.7.0: 2426 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 2427 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2428 | dependencies: 2429 | chalk: 4.1.2 2430 | diff-sequences: 29.6.3 2431 | jest-get-type: 29.6.3 2432 | pretty-format: 29.7.0 2433 | dev: true 2434 | 2435 | /jest-docblock@29.7.0: 2436 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 2437 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2438 | dependencies: 2439 | detect-newline: 3.1.0 2440 | dev: true 2441 | 2442 | /jest-each@29.7.0: 2443 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 2444 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2445 | dependencies: 2446 | '@jest/types': 29.6.3 2447 | chalk: 4.1.2 2448 | jest-get-type: 29.6.3 2449 | jest-util: 29.7.0 2450 | pretty-format: 29.7.0 2451 | dev: true 2452 | 2453 | /jest-environment-jsdom@29.7.0: 2454 | resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} 2455 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2456 | peerDependencies: 2457 | canvas: ^2.5.0 2458 | peerDependenciesMeta: 2459 | canvas: 2460 | optional: true 2461 | dependencies: 2462 | '@jest/environment': 29.7.0 2463 | '@jest/fake-timers': 29.7.0 2464 | '@jest/types': 29.6.3 2465 | '@types/jsdom': 20.0.1 2466 | '@types/node': 22.13.8 2467 | jest-mock: 29.7.0 2468 | jest-util: 29.7.0 2469 | jsdom: 20.0.3 2470 | transitivePeerDependencies: 2471 | - bufferutil 2472 | - supports-color 2473 | - utf-8-validate 2474 | dev: true 2475 | 2476 | /jest-environment-node@29.7.0: 2477 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 2478 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2479 | dependencies: 2480 | '@jest/environment': 29.7.0 2481 | '@jest/fake-timers': 29.7.0 2482 | '@jest/types': 29.6.3 2483 | '@types/node': 22.13.8 2484 | jest-mock: 29.7.0 2485 | jest-util: 29.7.0 2486 | dev: true 2487 | 2488 | /jest-get-type@29.6.3: 2489 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 2490 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2491 | dev: true 2492 | 2493 | /jest-haste-map@29.7.0: 2494 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 2495 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2496 | dependencies: 2497 | '@jest/types': 29.6.3 2498 | '@types/graceful-fs': 4.1.9 2499 | '@types/node': 22.13.8 2500 | anymatch: 3.1.3 2501 | fb-watchman: 2.0.2 2502 | graceful-fs: 4.2.11 2503 | jest-regex-util: 29.6.3 2504 | jest-util: 29.7.0 2505 | jest-worker: 29.7.0 2506 | micromatch: 4.0.8 2507 | walker: 1.0.8 2508 | optionalDependencies: 2509 | fsevents: 2.3.3 2510 | dev: true 2511 | 2512 | /jest-leak-detector@29.7.0: 2513 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 2514 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2515 | dependencies: 2516 | jest-get-type: 29.6.3 2517 | pretty-format: 29.7.0 2518 | dev: true 2519 | 2520 | /jest-matcher-utils@29.7.0: 2521 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 2522 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2523 | dependencies: 2524 | chalk: 4.1.2 2525 | jest-diff: 29.7.0 2526 | jest-get-type: 29.6.3 2527 | pretty-format: 29.7.0 2528 | dev: true 2529 | 2530 | /jest-message-util@29.7.0: 2531 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 2532 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2533 | dependencies: 2534 | '@babel/code-frame': 7.26.2 2535 | '@jest/types': 29.6.3 2536 | '@types/stack-utils': 2.0.3 2537 | chalk: 4.1.2 2538 | graceful-fs: 4.2.11 2539 | micromatch: 4.0.8 2540 | pretty-format: 29.7.0 2541 | slash: 3.0.0 2542 | stack-utils: 2.0.6 2543 | dev: true 2544 | 2545 | /jest-mock@29.7.0: 2546 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 2547 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2548 | dependencies: 2549 | '@jest/types': 29.6.3 2550 | '@types/node': 22.13.8 2551 | jest-util: 29.7.0 2552 | dev: true 2553 | 2554 | /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2555 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 2556 | engines: {node: '>=6'} 2557 | peerDependencies: 2558 | jest-resolve: '*' 2559 | peerDependenciesMeta: 2560 | jest-resolve: 2561 | optional: true 2562 | dependencies: 2563 | jest-resolve: 29.7.0 2564 | dev: true 2565 | 2566 | /jest-regex-util@29.6.3: 2567 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 2568 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2569 | dev: true 2570 | 2571 | /jest-resolve-dependencies@29.7.0: 2572 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 2573 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2574 | dependencies: 2575 | jest-regex-util: 29.6.3 2576 | jest-snapshot: 29.7.0 2577 | transitivePeerDependencies: 2578 | - supports-color 2579 | dev: true 2580 | 2581 | /jest-resolve@29.7.0: 2582 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 2583 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2584 | dependencies: 2585 | chalk: 4.1.2 2586 | graceful-fs: 4.2.11 2587 | jest-haste-map: 29.7.0 2588 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2589 | jest-util: 29.7.0 2590 | jest-validate: 29.7.0 2591 | resolve: 1.22.10 2592 | resolve.exports: 2.0.3 2593 | slash: 3.0.0 2594 | dev: true 2595 | 2596 | /jest-runner@29.7.0: 2597 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 2598 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2599 | dependencies: 2600 | '@jest/console': 29.7.0 2601 | '@jest/environment': 29.7.0 2602 | '@jest/test-result': 29.7.0 2603 | '@jest/transform': 29.7.0 2604 | '@jest/types': 29.6.3 2605 | '@types/node': 22.13.8 2606 | chalk: 4.1.2 2607 | emittery: 0.13.1 2608 | graceful-fs: 4.2.11 2609 | jest-docblock: 29.7.0 2610 | jest-environment-node: 29.7.0 2611 | jest-haste-map: 29.7.0 2612 | jest-leak-detector: 29.7.0 2613 | jest-message-util: 29.7.0 2614 | jest-resolve: 29.7.0 2615 | jest-runtime: 29.7.0 2616 | jest-util: 29.7.0 2617 | jest-watcher: 29.7.0 2618 | jest-worker: 29.7.0 2619 | p-limit: 3.1.0 2620 | source-map-support: 0.5.13 2621 | transitivePeerDependencies: 2622 | - supports-color 2623 | dev: true 2624 | 2625 | /jest-runtime@29.7.0: 2626 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 2627 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2628 | dependencies: 2629 | '@jest/environment': 29.7.0 2630 | '@jest/fake-timers': 29.7.0 2631 | '@jest/globals': 29.7.0 2632 | '@jest/source-map': 29.6.3 2633 | '@jest/test-result': 29.7.0 2634 | '@jest/transform': 29.7.0 2635 | '@jest/types': 29.6.3 2636 | '@types/node': 22.13.8 2637 | chalk: 4.1.2 2638 | cjs-module-lexer: 1.4.3 2639 | collect-v8-coverage: 1.0.2 2640 | glob: 7.2.3 2641 | graceful-fs: 4.2.11 2642 | jest-haste-map: 29.7.0 2643 | jest-message-util: 29.7.0 2644 | jest-mock: 29.7.0 2645 | jest-regex-util: 29.6.3 2646 | jest-resolve: 29.7.0 2647 | jest-snapshot: 29.7.0 2648 | jest-util: 29.7.0 2649 | slash: 3.0.0 2650 | strip-bom: 4.0.0 2651 | transitivePeerDependencies: 2652 | - supports-color 2653 | dev: true 2654 | 2655 | /jest-snapshot@29.7.0: 2656 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 2657 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2658 | dependencies: 2659 | '@babel/core': 7.26.9 2660 | '@babel/generator': 7.26.9 2661 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) 2662 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) 2663 | '@babel/types': 7.26.9 2664 | '@jest/expect-utils': 29.7.0 2665 | '@jest/transform': 29.7.0 2666 | '@jest/types': 29.6.3 2667 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) 2668 | chalk: 4.1.2 2669 | expect: 29.7.0 2670 | graceful-fs: 4.2.11 2671 | jest-diff: 29.7.0 2672 | jest-get-type: 29.6.3 2673 | jest-matcher-utils: 29.7.0 2674 | jest-message-util: 29.7.0 2675 | jest-util: 29.7.0 2676 | natural-compare: 1.4.0 2677 | pretty-format: 29.7.0 2678 | semver: 7.7.1 2679 | transitivePeerDependencies: 2680 | - supports-color 2681 | dev: true 2682 | 2683 | /jest-util@29.7.0: 2684 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 2685 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2686 | dependencies: 2687 | '@jest/types': 29.6.3 2688 | '@types/node': 22.13.8 2689 | chalk: 4.1.2 2690 | ci-info: 3.9.0 2691 | graceful-fs: 4.2.11 2692 | picomatch: 2.3.1 2693 | dev: true 2694 | 2695 | /jest-validate@29.7.0: 2696 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 2697 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2698 | dependencies: 2699 | '@jest/types': 29.6.3 2700 | camelcase: 6.3.0 2701 | chalk: 4.1.2 2702 | jest-get-type: 29.6.3 2703 | leven: 3.1.0 2704 | pretty-format: 29.7.0 2705 | dev: true 2706 | 2707 | /jest-watcher@29.7.0: 2708 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 2709 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2710 | dependencies: 2711 | '@jest/test-result': 29.7.0 2712 | '@jest/types': 29.6.3 2713 | '@types/node': 22.13.8 2714 | ansi-escapes: 4.3.2 2715 | chalk: 4.1.2 2716 | emittery: 0.13.1 2717 | jest-util: 29.7.0 2718 | string-length: 4.0.2 2719 | dev: true 2720 | 2721 | /jest-worker@29.7.0: 2722 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 2723 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2724 | dependencies: 2725 | '@types/node': 22.13.8 2726 | jest-util: 29.7.0 2727 | merge-stream: 2.0.0 2728 | supports-color: 8.1.1 2729 | dev: true 2730 | 2731 | /jest@29.7.0(@types/node@22.13.8): 2732 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 2733 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2734 | hasBin: true 2735 | peerDependencies: 2736 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2737 | peerDependenciesMeta: 2738 | node-notifier: 2739 | optional: true 2740 | dependencies: 2741 | '@jest/core': 29.7.0 2742 | '@jest/types': 29.6.3 2743 | import-local: 3.2.0 2744 | jest-cli: 29.7.0(@types/node@22.13.8) 2745 | transitivePeerDependencies: 2746 | - '@types/node' 2747 | - babel-plugin-macros 2748 | - supports-color 2749 | - ts-node 2750 | dev: true 2751 | 2752 | /js-tokens@4.0.0: 2753 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2754 | requiresBuild: true 2755 | dev: true 2756 | 2757 | /js-yaml@3.14.1: 2758 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2759 | hasBin: true 2760 | dependencies: 2761 | argparse: 1.0.10 2762 | esprima: 4.0.1 2763 | dev: true 2764 | 2765 | /jsdom@20.0.3: 2766 | resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} 2767 | engines: {node: '>=14'} 2768 | peerDependencies: 2769 | canvas: ^2.5.0 2770 | peerDependenciesMeta: 2771 | canvas: 2772 | optional: true 2773 | dependencies: 2774 | abab: 2.0.6 2775 | acorn: 8.14.0 2776 | acorn-globals: 7.0.1 2777 | cssom: 0.5.0 2778 | cssstyle: 2.3.0 2779 | data-urls: 3.0.2 2780 | decimal.js: 10.5.0 2781 | domexception: 4.0.0 2782 | escodegen: 2.1.0 2783 | form-data: 4.0.2 2784 | html-encoding-sniffer: 3.0.0 2785 | http-proxy-agent: 5.0.0 2786 | https-proxy-agent: 5.0.1 2787 | is-potential-custom-element-name: 1.0.1 2788 | nwsapi: 2.2.16 2789 | parse5: 7.2.1 2790 | saxes: 6.0.0 2791 | symbol-tree: 3.2.4 2792 | tough-cookie: 4.1.4 2793 | w3c-xmlserializer: 4.0.0 2794 | webidl-conversions: 7.0.0 2795 | whatwg-encoding: 2.0.0 2796 | whatwg-mimetype: 3.0.0 2797 | whatwg-url: 11.0.0 2798 | ws: 8.18.1 2799 | xml-name-validator: 4.0.0 2800 | transitivePeerDependencies: 2801 | - bufferutil 2802 | - supports-color 2803 | - utf-8-validate 2804 | dev: true 2805 | 2806 | /jsesc@3.1.0: 2807 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 2808 | engines: {node: '>=6'} 2809 | hasBin: true 2810 | dev: true 2811 | 2812 | /json-parse-even-better-errors@2.3.1: 2813 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2814 | dev: true 2815 | 2816 | /json5@2.2.3: 2817 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2818 | engines: {node: '>=6'} 2819 | hasBin: true 2820 | dev: true 2821 | 2822 | /kleur@3.0.3: 2823 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2824 | engines: {node: '>=6'} 2825 | dev: true 2826 | 2827 | /leven@3.1.0: 2828 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 2829 | engines: {node: '>=6'} 2830 | dev: true 2831 | 2832 | /lines-and-columns@1.2.4: 2833 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2834 | dev: true 2835 | 2836 | /locate-path@5.0.0: 2837 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2838 | engines: {node: '>=8'} 2839 | dependencies: 2840 | p-locate: 4.1.0 2841 | dev: true 2842 | 2843 | /lodash.memoize@4.1.2: 2844 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 2845 | dev: true 2846 | 2847 | /lru-cache@10.4.3: 2848 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 2849 | dev: true 2850 | 2851 | /lru-cache@5.1.1: 2852 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2853 | dependencies: 2854 | yallist: 3.1.1 2855 | dev: true 2856 | 2857 | /magic-string@0.30.17: 2858 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 2859 | dependencies: 2860 | '@jridgewell/sourcemap-codec': 1.5.0 2861 | dev: true 2862 | 2863 | /make-dir@4.0.0: 2864 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 2865 | engines: {node: '>=10'} 2866 | dependencies: 2867 | semver: 7.7.1 2868 | dev: true 2869 | 2870 | /make-error@1.3.6: 2871 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2872 | dev: true 2873 | 2874 | /makeerror@1.0.12: 2875 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2876 | dependencies: 2877 | tmpl: 1.0.5 2878 | dev: true 2879 | 2880 | /math-intrinsics@1.1.0: 2881 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 2882 | engines: {node: '>= 0.4'} 2883 | dev: true 2884 | 2885 | /merge-stream@2.0.0: 2886 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2887 | dev: true 2888 | 2889 | /micromatch@4.0.8: 2890 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 2891 | engines: {node: '>=8.6'} 2892 | dependencies: 2893 | braces: 3.0.3 2894 | picomatch: 2.3.1 2895 | dev: true 2896 | 2897 | /mime-db@1.52.0: 2898 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2899 | engines: {node: '>= 0.6'} 2900 | dev: true 2901 | 2902 | /mime-types@2.1.35: 2903 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2904 | engines: {node: '>= 0.6'} 2905 | dependencies: 2906 | mime-db: 1.52.0 2907 | dev: true 2908 | 2909 | /mimic-fn@2.1.0: 2910 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2911 | engines: {node: '>=6'} 2912 | dev: true 2913 | 2914 | /minimatch@3.1.2: 2915 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2916 | dependencies: 2917 | brace-expansion: 1.1.11 2918 | dev: true 2919 | 2920 | /minimatch@5.1.6: 2921 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 2922 | engines: {node: '>=10'} 2923 | dependencies: 2924 | brace-expansion: 2.0.1 2925 | dev: true 2926 | 2927 | /minimatch@9.0.5: 2928 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 2929 | engines: {node: '>=16 || 14 >=14.17'} 2930 | dependencies: 2931 | brace-expansion: 2.0.1 2932 | dev: true 2933 | 2934 | /minipass@7.1.2: 2935 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 2936 | engines: {node: '>=16 || 14 >=14.17'} 2937 | dev: true 2938 | 2939 | /ms@2.1.3: 2940 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2941 | dev: true 2942 | 2943 | /natural-compare@1.4.0: 2944 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2945 | dev: true 2946 | 2947 | /node-gyp-build-optional-packages@5.1.1: 2948 | resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} 2949 | hasBin: true 2950 | requiresBuild: true 2951 | dependencies: 2952 | detect-libc: 2.0.3 2953 | dev: false 2954 | optional: true 2955 | 2956 | /node-int64@0.4.0: 2957 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 2958 | dev: true 2959 | 2960 | /node-releases@2.0.19: 2961 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 2962 | dev: true 2963 | 2964 | /normalize-path@3.0.0: 2965 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2966 | engines: {node: '>=0.10.0'} 2967 | dev: true 2968 | 2969 | /npm-run-path@4.0.1: 2970 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2971 | engines: {node: '>=8'} 2972 | dependencies: 2973 | path-key: 3.1.1 2974 | dev: true 2975 | 2976 | /nwsapi@2.2.16: 2977 | resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} 2978 | dev: true 2979 | 2980 | /once@1.4.0: 2981 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2982 | dependencies: 2983 | wrappy: 1.0.2 2984 | dev: true 2985 | 2986 | /onetime@5.1.2: 2987 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2988 | engines: {node: '>=6'} 2989 | dependencies: 2990 | mimic-fn: 2.1.0 2991 | dev: true 2992 | 2993 | /p-limit@2.3.0: 2994 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2995 | engines: {node: '>=6'} 2996 | dependencies: 2997 | p-try: 2.2.0 2998 | dev: true 2999 | 3000 | /p-limit@3.1.0: 3001 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 3002 | engines: {node: '>=10'} 3003 | dependencies: 3004 | yocto-queue: 0.1.0 3005 | dev: true 3006 | 3007 | /p-locate@4.1.0: 3008 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 3009 | engines: {node: '>=8'} 3010 | dependencies: 3011 | p-limit: 2.3.0 3012 | dev: true 3013 | 3014 | /p-try@2.2.0: 3015 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 3016 | engines: {node: '>=6'} 3017 | dev: true 3018 | 3019 | /package-json-from-dist@1.0.1: 3020 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 3021 | dev: true 3022 | 3023 | /parse-json@5.2.0: 3024 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 3025 | engines: {node: '>=8'} 3026 | dependencies: 3027 | '@babel/code-frame': 7.26.2 3028 | error-ex: 1.3.2 3029 | json-parse-even-better-errors: 2.3.1 3030 | lines-and-columns: 1.2.4 3031 | dev: true 3032 | 3033 | /parse5@7.2.1: 3034 | resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 3035 | dependencies: 3036 | entities: 4.5.0 3037 | dev: true 3038 | 3039 | /path-exists@4.0.0: 3040 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 3041 | engines: {node: '>=8'} 3042 | dev: true 3043 | 3044 | /path-is-absolute@1.0.1: 3045 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 3046 | engines: {node: '>=0.10.0'} 3047 | dev: true 3048 | 3049 | /path-key@3.1.1: 3050 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 3051 | engines: {node: '>=8'} 3052 | dev: true 3053 | 3054 | /path-parse@1.0.7: 3055 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 3056 | dev: true 3057 | 3058 | /path-scurry@1.11.1: 3059 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 3060 | engines: {node: '>=16 || 14 >=14.18'} 3061 | dependencies: 3062 | lru-cache: 10.4.3 3063 | minipass: 7.1.2 3064 | dev: true 3065 | 3066 | /pathe@2.0.3: 3067 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 3068 | dev: true 3069 | 3070 | /picocolors@1.1.1: 3071 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 3072 | dev: true 3073 | 3074 | /picomatch@2.3.1: 3075 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 3076 | engines: {node: '>=8.6'} 3077 | dev: true 3078 | 3079 | /picomatch@4.0.2: 3080 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 3081 | engines: {node: '>=12'} 3082 | dev: true 3083 | 3084 | /pirates@4.0.6: 3085 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 3086 | engines: {node: '>= 6'} 3087 | dev: true 3088 | 3089 | /pkg-dir@4.2.0: 3090 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 3091 | engines: {node: '>=8'} 3092 | dependencies: 3093 | find-up: 4.1.0 3094 | dev: true 3095 | 3096 | /prettier@3.5.2: 3097 | resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} 3098 | engines: {node: '>=14'} 3099 | hasBin: true 3100 | dev: true 3101 | 3102 | /pretty-format@29.7.0: 3103 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 3104 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 3105 | dependencies: 3106 | '@jest/schemas': 29.6.3 3107 | ansi-styles: 5.2.0 3108 | react-is: 18.3.1 3109 | dev: true 3110 | 3111 | /prompts@2.4.2: 3112 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 3113 | engines: {node: '>= 6'} 3114 | dependencies: 3115 | kleur: 3.0.3 3116 | sisteransi: 1.0.5 3117 | dev: true 3118 | 3119 | /psl@1.15.0: 3120 | resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} 3121 | dependencies: 3122 | punycode: 2.3.1 3123 | dev: true 3124 | 3125 | /punycode@2.3.1: 3126 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 3127 | engines: {node: '>=6'} 3128 | dev: true 3129 | 3130 | /pure-rand@6.1.0: 3131 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 3132 | dev: true 3133 | 3134 | /querystringify@2.2.0: 3135 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 3136 | dev: true 3137 | 3138 | /randombytes@2.1.0: 3139 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 3140 | dependencies: 3141 | safe-buffer: 5.2.1 3142 | dev: true 3143 | 3144 | /react-is@18.3.1: 3145 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 3146 | dev: true 3147 | 3148 | /require-directory@2.1.1: 3149 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 3150 | engines: {node: '>=0.10.0'} 3151 | dev: true 3152 | 3153 | /requires-port@1.0.0: 3154 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 3155 | dev: true 3156 | 3157 | /resolve-cwd@3.0.0: 3158 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 3159 | engines: {node: '>=8'} 3160 | dependencies: 3161 | resolve-from: 5.0.0 3162 | dev: true 3163 | 3164 | /resolve-from@5.0.0: 3165 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 3166 | engines: {node: '>=8'} 3167 | dev: true 3168 | 3169 | /resolve-pkg-maps@1.0.0: 3170 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 3171 | dev: true 3172 | 3173 | /resolve.exports@2.0.3: 3174 | resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} 3175 | engines: {node: '>=10'} 3176 | dev: true 3177 | 3178 | /resolve@1.22.10: 3179 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 3180 | engines: {node: '>= 0.4'} 3181 | hasBin: true 3182 | dependencies: 3183 | is-core-module: 2.16.1 3184 | path-parse: 1.0.7 3185 | supports-preserve-symlinks-flag: 1.0.0 3186 | dev: true 3187 | 3188 | /rimraf@5.0.10: 3189 | resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} 3190 | hasBin: true 3191 | dependencies: 3192 | glob: 10.4.5 3193 | dev: true 3194 | 3195 | /rollup-plugin-dts@6.1.1(rollup@4.34.9)(typescript@5.8.2): 3196 | resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} 3197 | engines: {node: '>=16'} 3198 | peerDependencies: 3199 | rollup: ^3.29.4 || ^4 3200 | typescript: ^4.5 || ^5.0 3201 | dependencies: 3202 | magic-string: 0.30.17 3203 | rollup: 4.34.9 3204 | typescript: 5.8.2 3205 | optionalDependencies: 3206 | '@babel/code-frame': 7.26.2 3207 | dev: true 3208 | 3209 | /rollup-plugin-esbuild@6.2.1(esbuild@0.25.0)(rollup@4.34.9): 3210 | resolution: {integrity: sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA==} 3211 | engines: {node: '>=14.18.0'} 3212 | peerDependencies: 3213 | esbuild: '>=0.18.0' 3214 | rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 3215 | dependencies: 3216 | debug: 4.4.0 3217 | es-module-lexer: 1.6.0 3218 | esbuild: 0.25.0 3219 | get-tsconfig: 4.10.0 3220 | rollup: 4.34.9 3221 | unplugin-utils: 0.2.4 3222 | transitivePeerDependencies: 3223 | - supports-color 3224 | dev: true 3225 | 3226 | /rollup@4.34.9: 3227 | resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} 3228 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 3229 | hasBin: true 3230 | dependencies: 3231 | '@types/estree': 1.0.6 3232 | optionalDependencies: 3233 | '@rollup/rollup-android-arm-eabi': 4.34.9 3234 | '@rollup/rollup-android-arm64': 4.34.9 3235 | '@rollup/rollup-darwin-arm64': 4.34.9 3236 | '@rollup/rollup-darwin-x64': 4.34.9 3237 | '@rollup/rollup-freebsd-arm64': 4.34.9 3238 | '@rollup/rollup-freebsd-x64': 4.34.9 3239 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 3240 | '@rollup/rollup-linux-arm-musleabihf': 4.34.9 3241 | '@rollup/rollup-linux-arm64-gnu': 4.34.9 3242 | '@rollup/rollup-linux-arm64-musl': 4.34.9 3243 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 3244 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 3245 | '@rollup/rollup-linux-riscv64-gnu': 4.34.9 3246 | '@rollup/rollup-linux-s390x-gnu': 4.34.9 3247 | '@rollup/rollup-linux-x64-gnu': 4.34.9 3248 | '@rollup/rollup-linux-x64-musl': 4.34.9 3249 | '@rollup/rollup-win32-arm64-msvc': 4.34.9 3250 | '@rollup/rollup-win32-ia32-msvc': 4.34.9 3251 | '@rollup/rollup-win32-x64-msvc': 4.34.9 3252 | fsevents: 2.3.3 3253 | dev: true 3254 | 3255 | /safe-buffer@5.2.1: 3256 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 3257 | dev: true 3258 | 3259 | /safer-buffer@2.1.2: 3260 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 3261 | dev: true 3262 | 3263 | /saxes@6.0.0: 3264 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 3265 | engines: {node: '>=v12.22.7'} 3266 | dependencies: 3267 | xmlchars: 2.2.0 3268 | dev: true 3269 | 3270 | /semver@6.3.1: 3271 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 3272 | hasBin: true 3273 | dev: true 3274 | 3275 | /semver@7.7.1: 3276 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 3277 | engines: {node: '>=10'} 3278 | hasBin: true 3279 | dev: true 3280 | 3281 | /serialize-javascript@6.0.2: 3282 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 3283 | dependencies: 3284 | randombytes: 2.1.0 3285 | dev: true 3286 | 3287 | /shebang-command@2.0.0: 3288 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 3289 | engines: {node: '>=8'} 3290 | dependencies: 3291 | shebang-regex: 3.0.0 3292 | dev: true 3293 | 3294 | /shebang-regex@3.0.0: 3295 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 3296 | engines: {node: '>=8'} 3297 | dev: true 3298 | 3299 | /signal-exit@3.0.7: 3300 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 3301 | dev: true 3302 | 3303 | /signal-exit@4.1.0: 3304 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 3305 | engines: {node: '>=14'} 3306 | dev: true 3307 | 3308 | /sisteransi@1.0.5: 3309 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 3310 | dev: true 3311 | 3312 | /slash@3.0.0: 3313 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 3314 | engines: {node: '>=8'} 3315 | dev: true 3316 | 3317 | /smob@1.5.0: 3318 | resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} 3319 | dev: true 3320 | 3321 | /source-map-support@0.5.13: 3322 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 3323 | dependencies: 3324 | buffer-from: 1.1.2 3325 | source-map: 0.6.1 3326 | dev: true 3327 | 3328 | /source-map-support@0.5.21: 3329 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 3330 | dependencies: 3331 | buffer-from: 1.1.2 3332 | source-map: 0.6.1 3333 | dev: true 3334 | 3335 | /source-map@0.6.1: 3336 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 3337 | engines: {node: '>=0.10.0'} 3338 | dev: true 3339 | 3340 | /sprintf-js@1.0.3: 3341 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 3342 | dev: true 3343 | 3344 | /stack-utils@2.0.6: 3345 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 3346 | engines: {node: '>=10'} 3347 | dependencies: 3348 | escape-string-regexp: 2.0.0 3349 | dev: true 3350 | 3351 | /string-length@4.0.2: 3352 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 3353 | engines: {node: '>=10'} 3354 | dependencies: 3355 | char-regex: 1.0.2 3356 | strip-ansi: 6.0.1 3357 | dev: true 3358 | 3359 | /string-width@4.2.3: 3360 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 3361 | engines: {node: '>=8'} 3362 | dependencies: 3363 | emoji-regex: 8.0.0 3364 | is-fullwidth-code-point: 3.0.0 3365 | strip-ansi: 6.0.1 3366 | dev: true 3367 | 3368 | /string-width@5.1.2: 3369 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 3370 | engines: {node: '>=12'} 3371 | dependencies: 3372 | eastasianwidth: 0.2.0 3373 | emoji-regex: 9.2.2 3374 | strip-ansi: 7.1.0 3375 | dev: true 3376 | 3377 | /strip-ansi@6.0.1: 3378 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3379 | engines: {node: '>=8'} 3380 | dependencies: 3381 | ansi-regex: 5.0.1 3382 | dev: true 3383 | 3384 | /strip-ansi@7.1.0: 3385 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 3386 | engines: {node: '>=12'} 3387 | dependencies: 3388 | ansi-regex: 6.1.0 3389 | dev: true 3390 | 3391 | /strip-bom@4.0.0: 3392 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 3393 | engines: {node: '>=8'} 3394 | dev: true 3395 | 3396 | /strip-final-newline@2.0.0: 3397 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 3398 | engines: {node: '>=6'} 3399 | dev: true 3400 | 3401 | /strip-json-comments@3.1.1: 3402 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3403 | engines: {node: '>=8'} 3404 | dev: true 3405 | 3406 | /supports-color@7.2.0: 3407 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 3408 | engines: {node: '>=8'} 3409 | dependencies: 3410 | has-flag: 4.0.0 3411 | dev: true 3412 | 3413 | /supports-color@8.1.1: 3414 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 3415 | engines: {node: '>=10'} 3416 | dependencies: 3417 | has-flag: 4.0.0 3418 | dev: true 3419 | 3420 | /supports-preserve-symlinks-flag@1.0.0: 3421 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 3422 | engines: {node: '>= 0.4'} 3423 | dev: true 3424 | 3425 | /symbol-tree@3.2.4: 3426 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 3427 | dev: true 3428 | 3429 | /terser@5.39.0: 3430 | resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 3431 | engines: {node: '>=10'} 3432 | hasBin: true 3433 | dependencies: 3434 | '@jridgewell/source-map': 0.3.6 3435 | acorn: 8.14.0 3436 | commander: 2.20.3 3437 | source-map-support: 0.5.21 3438 | dev: true 3439 | 3440 | /test-exclude@6.0.0: 3441 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 3442 | engines: {node: '>=8'} 3443 | dependencies: 3444 | '@istanbuljs/schema': 0.1.3 3445 | glob: 7.2.3 3446 | minimatch: 3.1.2 3447 | dev: true 3448 | 3449 | /tmpl@1.0.5: 3450 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 3451 | dev: true 3452 | 3453 | /to-regex-range@5.0.1: 3454 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3455 | engines: {node: '>=8.0'} 3456 | dependencies: 3457 | is-number: 7.0.0 3458 | dev: true 3459 | 3460 | /tough-cookie@4.1.4: 3461 | resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} 3462 | engines: {node: '>=6'} 3463 | dependencies: 3464 | psl: 1.15.0 3465 | punycode: 2.3.1 3466 | universalify: 0.2.0 3467 | url-parse: 1.5.10 3468 | dev: true 3469 | 3470 | /tr46@3.0.0: 3471 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} 3472 | engines: {node: '>=12'} 3473 | dependencies: 3474 | punycode: 2.3.1 3475 | dev: true 3476 | 3477 | /ts-jest@29.2.6(@babel/core@7.26.9)(esbuild@0.25.0)(jest@29.7.0)(typescript@5.8.2): 3478 | resolution: {integrity: sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==} 3479 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 3480 | hasBin: true 3481 | peerDependencies: 3482 | '@babel/core': '>=7.0.0-beta.0 <8' 3483 | '@jest/transform': ^29.0.0 3484 | '@jest/types': ^29.0.0 3485 | babel-jest: ^29.0.0 3486 | esbuild: '*' 3487 | jest: ^29.0.0 3488 | typescript: '>=4.3 <6' 3489 | peerDependenciesMeta: 3490 | '@babel/core': 3491 | optional: true 3492 | '@jest/transform': 3493 | optional: true 3494 | '@jest/types': 3495 | optional: true 3496 | babel-jest: 3497 | optional: true 3498 | esbuild: 3499 | optional: true 3500 | dependencies: 3501 | '@babel/core': 7.26.9 3502 | bs-logger: 0.2.6 3503 | ejs: 3.1.10 3504 | esbuild: 0.25.0 3505 | fast-json-stable-stringify: 2.1.0 3506 | jest: 29.7.0(@types/node@22.13.8) 3507 | jest-util: 29.7.0 3508 | json5: 2.2.3 3509 | lodash.memoize: 4.1.2 3510 | make-error: 1.3.6 3511 | semver: 7.7.1 3512 | typescript: 5.8.2 3513 | yargs-parser: 21.1.1 3514 | dev: true 3515 | 3516 | /tslib@2.8.1: 3517 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 3518 | dev: true 3519 | 3520 | /type-detect@4.0.8: 3521 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 3522 | engines: {node: '>=4'} 3523 | dev: true 3524 | 3525 | /type-fest@0.21.3: 3526 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 3527 | engines: {node: '>=10'} 3528 | dev: true 3529 | 3530 | /typescript@5.8.2: 3531 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 3532 | engines: {node: '>=14.17'} 3533 | hasBin: true 3534 | dev: true 3535 | 3536 | /undici-types@6.20.0: 3537 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 3538 | dev: true 3539 | 3540 | /universalify@0.2.0: 3541 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 3542 | engines: {node: '>= 4.0.0'} 3543 | dev: true 3544 | 3545 | /unplugin-utils@0.2.4: 3546 | resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} 3547 | engines: {node: '>=18.12.0'} 3548 | dependencies: 3549 | pathe: 2.0.3 3550 | picomatch: 4.0.2 3551 | dev: true 3552 | 3553 | /update-browserslist-db@1.1.3(browserslist@4.24.4): 3554 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 3555 | hasBin: true 3556 | peerDependencies: 3557 | browserslist: '>= 4.21.0' 3558 | dependencies: 3559 | browserslist: 4.24.4 3560 | escalade: 3.2.0 3561 | picocolors: 1.1.1 3562 | dev: true 3563 | 3564 | /url-parse@1.5.10: 3565 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 3566 | dependencies: 3567 | querystringify: 2.2.0 3568 | requires-port: 1.0.0 3569 | dev: true 3570 | 3571 | /v8-to-istanbul@9.3.0: 3572 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 3573 | engines: {node: '>=10.12.0'} 3574 | dependencies: 3575 | '@jridgewell/trace-mapping': 0.3.25 3576 | '@types/istanbul-lib-coverage': 2.0.6 3577 | convert-source-map: 2.0.0 3578 | dev: true 3579 | 3580 | /w3c-xmlserializer@4.0.0: 3581 | resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} 3582 | engines: {node: '>=14'} 3583 | dependencies: 3584 | xml-name-validator: 4.0.0 3585 | dev: true 3586 | 3587 | /walker@1.0.8: 3588 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 3589 | dependencies: 3590 | makeerror: 1.0.12 3591 | dev: true 3592 | 3593 | /webidl-conversions@7.0.0: 3594 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 3595 | engines: {node: '>=12'} 3596 | dev: true 3597 | 3598 | /whatwg-encoding@2.0.0: 3599 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 3600 | engines: {node: '>=12'} 3601 | dependencies: 3602 | iconv-lite: 0.6.3 3603 | dev: true 3604 | 3605 | /whatwg-mimetype@3.0.0: 3606 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 3607 | engines: {node: '>=12'} 3608 | dev: true 3609 | 3610 | /whatwg-url@11.0.0: 3611 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} 3612 | engines: {node: '>=12'} 3613 | dependencies: 3614 | tr46: 3.0.0 3615 | webidl-conversions: 7.0.0 3616 | dev: true 3617 | 3618 | /which@2.0.2: 3619 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3620 | engines: {node: '>= 8'} 3621 | hasBin: true 3622 | dependencies: 3623 | isexe: 2.0.0 3624 | dev: true 3625 | 3626 | /wrap-ansi@7.0.0: 3627 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 3628 | engines: {node: '>=10'} 3629 | dependencies: 3630 | ansi-styles: 4.3.0 3631 | string-width: 4.2.3 3632 | strip-ansi: 6.0.1 3633 | dev: true 3634 | 3635 | /wrap-ansi@8.1.0: 3636 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 3637 | engines: {node: '>=12'} 3638 | dependencies: 3639 | ansi-styles: 6.2.1 3640 | string-width: 5.1.2 3641 | strip-ansi: 7.1.0 3642 | dev: true 3643 | 3644 | /wrappy@1.0.2: 3645 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3646 | dev: true 3647 | 3648 | /write-file-atomic@4.0.2: 3649 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 3650 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3651 | dependencies: 3652 | imurmurhash: 0.1.4 3653 | signal-exit: 3.0.7 3654 | dev: true 3655 | 3656 | /ws@8.18.1: 3657 | resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} 3658 | engines: {node: '>=10.0.0'} 3659 | peerDependencies: 3660 | bufferutil: ^4.0.1 3661 | utf-8-validate: '>=5.0.2' 3662 | peerDependenciesMeta: 3663 | bufferutil: 3664 | optional: true 3665 | utf-8-validate: 3666 | optional: true 3667 | dev: true 3668 | 3669 | /xml-name-validator@4.0.0: 3670 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 3671 | engines: {node: '>=12'} 3672 | dev: true 3673 | 3674 | /xmlchars@2.2.0: 3675 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 3676 | dev: true 3677 | 3678 | /y18n@5.0.8: 3679 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 3680 | engines: {node: '>=10'} 3681 | dev: true 3682 | 3683 | /yallist@3.1.1: 3684 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 3685 | dev: true 3686 | 3687 | /yargs-parser@21.1.1: 3688 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 3689 | engines: {node: '>=12'} 3690 | dev: true 3691 | 3692 | /yargs@17.7.2: 3693 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 3694 | engines: {node: '>=12'} 3695 | dependencies: 3696 | cliui: 8.0.1 3697 | escalade: 3.2.0 3698 | get-caller-file: 2.0.5 3699 | require-directory: 2.1.1 3700 | string-width: 4.2.3 3701 | y18n: 5.0.8 3702 | yargs-parser: 21.1.1 3703 | dev: true 3704 | 3705 | /yocto-queue@0.1.0: 3706 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3707 | engines: {node: '>=10'} 3708 | dev: true 3709 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from '@rollup/plugin-node-resolve' 2 | import commonjs from '@rollup/plugin-commonjs' 3 | import esbuild from 'rollup-plugin-esbuild' 4 | import terser from '@rollup/plugin-terser' 5 | import { dts } from 'rollup-plugin-dts' 6 | 7 | export default [ 8 | { 9 | input: 'src/index.ts', 10 | plugins: [ 11 | esbuild(), 12 | resolve({ 13 | preferBuiltins: true, 14 | browser: true 15 | }), 16 | commonjs(), 17 | terser() 18 | ], 19 | output: [ 20 | { 21 | file: 'dist/bundle.js', 22 | format: 'esm' 23 | } 24 | ] 25 | }, 26 | { 27 | input: 'src/index.ts', 28 | plugins: [dts()], 29 | output: { 30 | file: 'dist/bundle.d.ts', 31 | format: 'es', 32 | }, 33 | } 34 | ] 35 | -------------------------------------------------------------------------------- /src/canonical.ts: -------------------------------------------------------------------------------- 1 | import type { Serializable } from './types' 2 | 3 | export function encodeCanonical(input: Serializable | Serializable[]): Uint8Array { 4 | const encoder = new TextEncoder() 5 | 6 | if (input === null) { 7 | return new Uint8Array([0x00]) 8 | } 9 | 10 | if (typeof input === 'boolean') { 11 | return new Uint8Array([0x01, input ? 0x01 : 0x00]) 12 | } 13 | 14 | if (typeof input === 'number') { 15 | if (!Number.isInteger(input) || input < 0 || input > 4294967295) { 16 | throw new Error('Input is not a 32-bit unsigned integer') 17 | } 18 | 19 | const header = new Uint8Array([0x02]) 20 | const number = new Uint8Array(new Uint32Array([input]).buffer) 21 | return new Uint8Array([...header, ...number]) 22 | } 23 | 24 | if (input instanceof Uint8Array) { 25 | if (input.length > 4294967295) { 26 | throw new Error('Uint8Array length exceeds 32-bit integer limit') 27 | } 28 | 29 | const header = new Uint8Array([0x10]) 30 | const length = new Uint8Array(new Uint32Array([input.length]).buffer) 31 | return new Uint8Array([...header, ...length, ...input]) 32 | } 33 | 34 | if (typeof input === 'string') { 35 | const encodedString = encoder.encode(input) 36 | 37 | if (encodedString.length > 4294967295) { 38 | throw new Error('String length exceeds 32-bit integer limit') 39 | } 40 | 41 | const header = new Uint8Array([0x11]) 42 | const length = new Uint8Array(new Uint32Array([encodedString.length]).buffer) 43 | return new Uint8Array([...header, ...length, ...encodedString]) 44 | } 45 | 46 | if (Array.isArray(input)) { 47 | const elements: Uint8Array[] = [] 48 | 49 | for (const item of input) { 50 | elements.push(encodeCanonical(item)) 51 | } 52 | 53 | const totalLength = elements.reduce((acc, el) => acc + el.length, 0) 54 | 55 | if (totalLength > 4294967295) { 56 | throw new Error('Array total encoded length exceeds 32-bit integer limit') 57 | } 58 | 59 | const header = new Uint8Array([0x20]) 60 | const length = new Uint8Array(new Uint32Array([elements.length]).buffer) 61 | const elementsArray = Uint8Array.from(elements.flatMap((e) => Array.from(e))) 62 | return new Uint8Array([...header, ...length, ...elementsArray]) 63 | } 64 | 65 | throw new Error('Unsupported type') 66 | } 67 | -------------------------------------------------------------------------------- /src/cbor.ts: -------------------------------------------------------------------------------- 1 | import * as cbor from 'cbor-x' 2 | 3 | const cborContext = new cbor.Encoder({ 4 | useRecords: false, 5 | mapsAsObjects: true 6 | }) 7 | 8 | export const encodeCbor = (data: any): Uint8Array => { 9 | return Uint8Array.from(cborContext.encode(data)) 10 | } 11 | 12 | export const decodeCbor = (payload: Uint8Array): any => { 13 | return cborContext.decode(payload) 14 | } 15 | -------------------------------------------------------------------------------- /src/core.ts: -------------------------------------------------------------------------------- 1 | import isNode from 'detect-node' 2 | const crypto = isNode ? require('crypto') : window.crypto 3 | 4 | import type { Serializable, Secret } from './types' 5 | import { encodeCanonical } from './canonical' 6 | 7 | const ENCRYPTION_ALGORITHM = { 8 | name: 'AES-GCM', 9 | tagLength: 128 10 | } 11 | 12 | const HASH_ALGORITHM = { 13 | hash: 'SHA-256' 14 | } 15 | 16 | const KEY_DERIVATION_ALGORITHM = { 17 | name: 'HKDF' 18 | } 19 | 20 | const PASSWORD_HASHING_ALGORITHM = { 21 | name: 'PBKDF2', 22 | iterations: 500_000 23 | } 24 | 25 | export const generateRandomBytes = (length: number): Uint8Array => { 26 | if (isNode) { 27 | return crypto.randomBytes(length) 28 | } else { 29 | const buffer = new Uint8Array(length) 30 | crypto.getRandomValues(buffer) 31 | return buffer 32 | } 33 | } 34 | 35 | export const generateUUID = async () => { 36 | const bytes = generateRandomBytes(16) 37 | return [...bytes] 38 | .map((b) => b.toString(16).padStart(2, '0')) 39 | .join('') 40 | .replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '$1-$2-4$3-$4-$5') 41 | } 42 | 43 | export const generateKeyBytes = async (): Promise => { 44 | return new Uint8Array(generateRandomBytes(32)) 45 | } 46 | 47 | export const loadEncryptionKey = async (keyData: Uint8Array): Promise => { 48 | return await crypto.subtle.importKey('raw', keyData, ENCRYPTION_ALGORITHM, false, ['encrypt']) 49 | } 50 | 51 | export const loadDecryptionKey = async (keyData: Uint8Array): Promise => { 52 | return await crypto.subtle.importKey('raw', keyData, ENCRYPTION_ALGORITHM, false, ['decrypt']) 53 | } 54 | 55 | export const encryptData = async ( 56 | data: Uint8Array, 57 | key: CryptoKey, 58 | associatedData?: Uint8Array 59 | ): Promise<[Uint8Array, Uint8Array]> => { 60 | const iv = crypto.getRandomValues(new Uint8Array(12)) 61 | const buffer = await crypto.subtle.encrypt({ ...ENCRYPTION_ALGORITHM, iv, additionalData: associatedData }, key, data) 62 | return [iv, new Uint8Array(buffer)] 63 | } 64 | 65 | export const decryptData = async ( 66 | iv: Uint8Array, 67 | ciphertext: Uint8Array, 68 | key: CryptoKey, 69 | associatedData?: Uint8Array 70 | ): Promise => { 71 | const buffer = await crypto.subtle.decrypt( 72 | { ...ENCRYPTION_ALGORITHM, iv, additionalData: associatedData }, 73 | key, 74 | ciphertext 75 | ) 76 | return new Uint8Array(buffer) 77 | } 78 | 79 | async function deriveKey(key: Uint8Array, outputLength: number): Promise { 80 | const keyMaterial = await crypto.subtle.importKey('raw', key, KEY_DERIVATION_ALGORITHM, false, ['deriveBits']) 81 | 82 | const derivedBits = await crypto.subtle.deriveBits( 83 | { 84 | ...KEY_DERIVATION_ALGORITHM, 85 | ...HASH_ALGORITHM, 86 | info: new Uint8Array(), 87 | salt: new Uint8Array() 88 | }, 89 | keyMaterial, 90 | outputLength * 8 91 | ) 92 | 93 | return new Uint8Array(derivedBits) 94 | } 95 | 96 | export async function deriveMatryoshkaKeys(masterKey: Uint8Array, outputLengths: number[]): Promise { 97 | let secretState = masterKey 98 | const secretStateLength = secretState.length 99 | const outputs: Uint8Array[] = [] 100 | 101 | for (const outputLength of outputLengths) { 102 | const extendedOutputLength = secretStateLength + outputLength 103 | const derivedBytes = await deriveKey(secretState, extendedOutputLength) 104 | 105 | const newSecretMaterial = derivedBytes.slice(0, secretStateLength) 106 | const derivedValue = derivedBytes.slice(secretStateLength, secretStateLength + outputLength) 107 | 108 | secretState = newSecretMaterial 109 | outputs.push(derivedValue) 110 | } 111 | 112 | return outputs 113 | } 114 | 115 | export const deriveMasterKeyFromSecret = async ( 116 | secret: Secret, 117 | pv?: Serializable | Serializable[] 118 | ): Promise => { 119 | const encodedSecret: Uint8Array = encodeCanonical(secret) 120 | const encodedPv: Uint8Array = pv === undefined ? new Uint8Array() : encodeCanonical(pv) 121 | 122 | const importedKey = await crypto.subtle.importKey('raw', encodedSecret, PASSWORD_HASHING_ALGORITHM, false, [ 123 | 'deriveBits' 124 | ]) 125 | 126 | const derivedKeyBuffer = await crypto.subtle.deriveBits( 127 | { 128 | ...PASSWORD_HASHING_ALGORITHM, 129 | ...HASH_ALGORITHM, 130 | salt: encodedPv 131 | }, 132 | importedKey, 133 | 256 134 | ) 135 | 136 | return new Uint8Array(derivedKeyBuffer) 137 | } 138 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | decryptData, 3 | encryptData, 4 | generateKeyBytes, 5 | loadDecryptionKey, 6 | loadEncryptionKey, 7 | deriveMasterKeyFromSecret, 8 | deriveMatryoshkaKeys, 9 | generateUUID 10 | } from './core' 11 | 12 | import { encodeCanonical } from './canonical' 13 | 14 | import { encodeCbor, decodeCbor } from './cbor' 15 | 16 | import { 17 | Serializable, 18 | Secret, 19 | BundleV0Key, 20 | BundleV0, 21 | Bundle, 22 | EnvelopeV0, 23 | Envelope, 24 | EncryptedV0, 25 | Encrypted 26 | } from './types' 27 | 28 | class Minibone { 29 | public revision: number 30 | public uid: string 31 | private keys: BundleV0Key[] 32 | 33 | private constructor(revision: number, uid: string, keys: BundleV0Key[]) { 34 | this.revision = revision 35 | this.uid = uid 36 | this.keys = keys 37 | } 38 | 39 | /** 40 | * Initializes minibone for a new user. 41 | */ 42 | public static async create(): Promise { 43 | const uid = await generateUUID() 44 | const minibone = new Minibone(0, uid, []) 45 | await minibone.rotate() 46 | return minibone 47 | } 48 | 49 | /** 50 | * Safely merge minibone instances. 51 | */ 52 | public static merge(first: Minibone, second: Minibone): Minibone { 53 | if (first.uid != second.uid) { 54 | throw new Error('Cannot merge Minibone instances with different IDs.') 55 | } 56 | 57 | const mergedRevision = Math.max(first.revision, second.revision) + 1 58 | const mergedKeys = new Map(first.keys.map((key) => [key.id, key])) 59 | 60 | for (const key of second.keys) { 61 | mergedKeys.set(key.id, mergedKeys.get(key.id) || key) 62 | } 63 | 64 | return new Minibone(mergedRevision, first.uid, Array.from(mergedKeys.values())) 65 | } 66 | 67 | /** 68 | * Loads a minibone from a previous save. 69 | */ 70 | public static async load(payload: Uint8Array, secret: Secret, context?: Serializable[]): Promise { 71 | const envelope = decodeCbor(payload) 72 | 73 | if (!envelope.v0) { 74 | throw new Error('Unrecognised envelope payload') 75 | } 76 | 77 | const v0Envelope = envelope.v0 78 | 79 | const masterKey: Uint8Array = await deriveMasterKeyFromSecret(secret, context) 80 | const [rawBundleKey] = await deriveMatryoshkaKeys(masterKey, [32]) 81 | const bundleKey: CryptoKey = await loadDecryptionKey(rawBundleKey) 82 | 83 | const encodedAssociatedData: Uint8Array = encodeCanonical([v0Envelope.revision]) 84 | const encodedBundle: Uint8Array = await decryptData( 85 | v0Envelope.iv, 86 | v0Envelope.ciphertext, 87 | bundleKey, 88 | encodedAssociatedData 89 | ) 90 | const bundle: Bundle = decodeCbor(encodedBundle) 91 | 92 | if (!bundle.v0) { 93 | throw new Error('Unrecognised bundle payload') 94 | } 95 | 96 | const v0Bundle: BundleV0 = bundle.v0 97 | return new Minibone(v0Envelope.revisionrevision, v0Bundle.uid, v0Bundle.keys) 98 | } 99 | 100 | /** 101 | * Save a minibone instance's state. 102 | */ 103 | public async save(secret: Secret, context?: Serializable[]): Promise { 104 | const masterKey: Uint8Array = await deriveMasterKeyFromSecret(secret, context) 105 | const [rawBundleKey] = await deriveMatryoshkaKeys(masterKey, [32]) 106 | const bundleKey: CryptoKey = await loadEncryptionKey(rawBundleKey) 107 | 108 | const v0Bundle: BundleV0 = { 109 | uid: this.uid, 110 | keys: this.keys 111 | } 112 | 113 | const bundle: Bundle = { 114 | v0: v0Bundle 115 | } 116 | 117 | const newRevision = this.revision + 1 118 | 119 | const encodedBundle: Uint8Array = encodeCbor(bundle) 120 | const encodedAssociatedData: Uint8Array = encodeCanonical([newRevision]) 121 | const [bundleIv, bundleCiphertext] = await encryptData(encodedBundle, bundleKey, encodedAssociatedData) 122 | 123 | const v0Envelope: EnvelopeV0 = { 124 | revision: newRevision, 125 | iv: bundleIv, 126 | ciphertext: bundleCiphertext 127 | } 128 | 129 | const envelope: Envelope = { 130 | v0: v0Envelope 131 | } 132 | 133 | return encodeCbor(envelope) 134 | } 135 | 136 | /** 137 | * Rotates the current active encryption key. 138 | */ 139 | public async rotate(): Promise { 140 | const id = await generateUUID() 141 | const value = await generateKeyBytes() 142 | const key: BundleV0Key = { id, value } 143 | this.keys.push(key) 144 | } 145 | 146 | /** 147 | * Encrypts data using the latest key. 148 | */ 149 | public async encrypt(data: any, associatedData?: any): Promise { 150 | const encodedData = encodeCbor(data) 151 | 152 | const key = this.latestKey() 153 | const encryptionKey = await loadEncryptionKey(key.value) 154 | 155 | const [iv, ciphertext] = await encryptData(encodedData, encryptionKey, associatedData && encodeCbor(associatedData)) 156 | 157 | const encryptedV0: EncryptedV0 = { keyId: key.id, iv, ciphertext } 158 | const encrypted: Encrypted = { v0: encryptedV0 } 159 | return encodeCbor(encrypted) 160 | } 161 | 162 | /** 163 | * Decrypts the given ciphertext bundle using the appropriate key. 164 | */ 165 | public async decrypt(payload: Uint8Array, associatedData?: any): Promise { 166 | const encrypted: Encrypted = decodeCbor(payload) 167 | 168 | if (!encrypted.v0) { 169 | throw new Error('Unrecognised encrypted payload') 170 | } 171 | 172 | const encryptedV0: EncryptedV0 = encrypted.v0 173 | 174 | const key = this.getKey(encryptedV0.keyId) 175 | const decryptionKey = await loadDecryptionKey(key.value) 176 | 177 | const encodedData = await decryptData( 178 | encryptedV0.iv, 179 | encryptedV0.ciphertext, 180 | decryptionKey, 181 | associatedData && encodeCbor(associatedData) 182 | ) 183 | 184 | return decodeCbor(encodedData) 185 | } 186 | 187 | private latestKey(): BundleV0Key { 188 | return this.keys[this.keys.length - 1] 189 | } 190 | 191 | private getKey(id: string): BundleV0Key { 192 | return this.keys.filter((key) => key.id === id)[0] 193 | } 194 | } 195 | 196 | export default Minibone 197 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type Secret = string | Uint8Array 2 | export type Serializable = null | boolean | Uint8Array | string | number 3 | 4 | export interface EnvelopeV0 { 5 | revision: number 6 | iv: Uint8Array 7 | ciphertext: Uint8Array 8 | } 9 | 10 | export interface Envelope { 11 | v0?: EnvelopeV0 12 | } 13 | 14 | export interface BundleV0Key { 15 | id: string 16 | value: Uint8Array 17 | } 18 | 19 | export interface BundleV0 { 20 | uid: string 21 | keys: BundleV0Key[] 22 | } 23 | 24 | export interface Bundle { 25 | v0?: BundleV0 26 | } 27 | 28 | export interface EncryptedV0 { 29 | keyId: string 30 | iv: Uint8Array 31 | ciphertext: Uint8Array 32 | } 33 | 34 | export interface Encrypted { 35 | v0?: EncryptedV0 36 | } 37 | -------------------------------------------------------------------------------- /tests/index.test.ts: -------------------------------------------------------------------------------- 1 | import { TextEncoder, TextDecoder } from 'util' 2 | Object.assign(global, { TextEncoder, TextDecoder }) 3 | 4 | import Minibone from '../src' 5 | import { encodeCanonical } from '../src/canonical' 6 | import { encodeCbor, decodeCbor } from '../src/cbor' 7 | 8 | const data = { 9 | number: 1337, 10 | string: 'Hello, minibone!', 11 | array: ['Backbone', 0], 12 | bytes: new Uint8Array([6, 9, 4, 2, 0]) 13 | } 14 | 15 | describe('Minibone', () => { 16 | test('can encrypt and decrypt values', async () => { 17 | const minibone = await Minibone.create() 18 | const ciphertext = await minibone.encrypt(data) 19 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(data) 20 | }) 21 | 22 | test('rotation results in key change', async () => { 23 | const minibone = await Minibone.create() 24 | const olderCiphertext = await minibone.encrypt(data) 25 | await minibone.rotate() 26 | const newerCiphertext = await minibone.encrypt(data) 27 | 28 | const olderResult = decodeCbor(olderCiphertext) 29 | const newerResult = decodeCbor(newerCiphertext) 30 | expect(olderResult.v0.keyId).not.toEqual(newerResult.v0.keyId) 31 | }) 32 | 33 | test('can decrypt post rotation', async () => { 34 | const minibone = await Minibone.create() 35 | const ciphertext = await minibone.encrypt(data) 36 | await minibone.rotate() 37 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(data) 38 | }) 39 | 40 | test('profiles can be exported and imported', async () => { 41 | const minibone = await Minibone.create() 42 | const ciphertext = await minibone.encrypt(data) 43 | 44 | for (const context of [['test'], undefined]) { 45 | const exported = await minibone.save('minibone-secure-phrase', context) 46 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', context) 47 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 48 | } 49 | }) 50 | 51 | test('can be safely merged', async () => { 52 | const mainMinibone = await Minibone.create() 53 | 54 | const oldCiphertext = await mainMinibone.encrypt(data) 55 | const exportedOldMinibone = await mainMinibone.save('minibone-secure-phrase', ['test']) 56 | 57 | // `mainMinibone` is now out of date with `exportedOldMinibone` 58 | await mainMinibone.rotate() 59 | const mainCipherText = await mainMinibone.encrypt(data) 60 | 61 | // `branchedMinibone` and `mainMinibone` both now have unsynchronized keys 62 | const branchedMinibone = await Minibone.load(exportedOldMinibone, 'minibone-secure-phrase', ['test']) 63 | await branchedMinibone.rotate() 64 | const branchedCiphertext = await branchedMinibone.encrypt(data) 65 | 66 | // Expectations pre-merge 67 | await expect(mainMinibone.decrypt(oldCiphertext)).resolves.toEqual(data) 68 | await expect(mainMinibone.decrypt(mainCipherText)).resolves.toEqual(data) 69 | await expect(mainMinibone.decrypt(branchedCiphertext)).rejects.toThrow() 70 | 71 | await expect(branchedMinibone.decrypt(oldCiphertext)).resolves.toEqual(data) 72 | await expect(branchedMinibone.decrypt(mainCipherText)).rejects.toThrow() 73 | await expect(branchedMinibone.decrypt(branchedCiphertext)).resolves.toEqual(data) 74 | 75 | // Expectations post-merge 76 | const mergedMinibone = Minibone.merge(mainMinibone, branchedMinibone) 77 | await expect(mergedMinibone.decrypt(oldCiphertext)).resolves.toEqual(data) 78 | await expect(mergedMinibone.decrypt(mainCipherText)).resolves.toEqual(data) 79 | await expect(mergedMinibone.decrypt(branchedCiphertext)).resolves.toEqual(data) 80 | }) 81 | 82 | test('throws an error when trying to decrypt with an invalid key', async () => { 83 | const minibone = await Minibone.create() 84 | const ciphertext = await minibone.encrypt(data) 85 | await minibone.rotate() 86 | await minibone.rotate() 87 | await expect(minibone.decrypt(ciphertext, { keyId: '1234' })).rejects.toThrow() 88 | }) 89 | 90 | test('can encrypt and decrypt empty objects', async () => { 91 | const minibone = await Minibone.create() 92 | const emptyObject = {} 93 | const ciphertext = await minibone.encrypt(emptyObject) 94 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(emptyObject) 95 | }) 96 | 97 | test('can encrypt and decrypt null values', async () => { 98 | const minibone = await Minibone.create() 99 | const nullValue = null 100 | const ciphertext = await minibone.encrypt(nullValue) 101 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(nullValue) 102 | }) 103 | 104 | test('can encrypt and decrypt boolean values', async () => { 105 | const minibone = await Minibone.create() 106 | const booleanValue = true 107 | const ciphertext = await minibone.encrypt(booleanValue) 108 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(booleanValue) 109 | }) 110 | 111 | test('can encrypt and decrypt nested objects', async () => { 112 | const minibone = await Minibone.create() 113 | const nestedObject = { a: { b: { c: 'nested' } } } 114 | const ciphertext = await minibone.encrypt(nestedObject) 115 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(nestedObject) 116 | }) 117 | 118 | test('throws an error when trying to decrypt invalid ciphertext', async () => { 119 | const minibone = await Minibone.create() 120 | const invalidCiphertext = new Uint8Array([1, 2, 3]) 121 | await expect(minibone.decrypt(invalidCiphertext)).rejects.toThrow() 122 | }) 123 | 124 | test('can encrypt and decrypt with associated data', async () => { 125 | const minibone = await Minibone.create() 126 | const associatedData = { context: 'test' } 127 | const ciphertext = await minibone.encrypt(data, associatedData) 128 | await expect(minibone.decrypt(ciphertext, associatedData)).resolves.toEqual(data) 129 | }) 130 | 131 | test('throws an error when decrypting with incorrect associated data', async () => { 132 | const minibone = await Minibone.create() 133 | const associatedData = { context: 'test' } 134 | const ciphertext = await minibone.encrypt(data, associatedData) 135 | const incorrectAssociatedData = { context: 'incorrect' } 136 | await expect(minibone.decrypt(ciphertext, incorrectAssociatedData)).rejects.toThrow() 137 | }) 138 | 139 | test('can encrypt and decrypt large payloads', async () => { 140 | const minibone = await Minibone.create() 141 | const largeData = new Uint8Array(1024 * 1024) // 1 MB 142 | const ciphertext = await minibone.encrypt(largeData) 143 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(largeData) 144 | }) 145 | 146 | test('throws an error when trying to decrypt with a different secret', async () => { 147 | const minibone = await Minibone.create() 148 | const exported = await minibone.save('minibone-secure-phrase', ['test']) 149 | await expect(Minibone.load(exported, 'different-secure-phrase', ['test'])).rejects.toThrow() 150 | }) 151 | 152 | test('throws an error when trying to decrypt with a different context', async () => { 153 | const minibone = await Minibone.create() 154 | const exported = await minibone.save('minibone-secure-phrase', ['test']) 155 | await expect(Minibone.load(exported, 'minibone-secure-phrase', ['different-context'])).rejects.toThrow() 156 | }) 157 | 158 | test('can encrypt and decrypt with empty associated data', async () => { 159 | const minibone = await Minibone.create() 160 | const emptyAssociatedData = {} 161 | const ciphertext = await minibone.encrypt(data, emptyAssociatedData) 162 | await expect(minibone.decrypt(ciphertext, emptyAssociatedData)).resolves.toEqual(data) 163 | }) 164 | 165 | test('throws an error when trying to merge instances with different IDs', async () => { 166 | const minibone1 = await Minibone.create() 167 | const minibone2 = await Minibone.create() 168 | expect(() => Minibone.merge(minibone1, minibone2)).toThrow() 169 | }) 170 | 171 | test('can encrypt and decrypt values with special characters', async () => { 172 | const minibone = await Minibone.create() 173 | const specialCharData = { message: '!@#$%^&*()_+{}[]|\\:;"<>,.?/' } 174 | const ciphertext = await minibone.encrypt(specialCharData) 175 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(specialCharData) 176 | }) 177 | 178 | test('can encrypt and decrypt empty strings', async () => { 179 | const minibone = await Minibone.create() 180 | const emptyString = '' 181 | const ciphertext = await minibone.encrypt(emptyString) 182 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(emptyString) 183 | }) 184 | 185 | test('can encrypt and decrypt strings with Unicode characters', async () => { 186 | const minibone = await Minibone.create() 187 | const unicodeString = '你好,世界!' 188 | const ciphertext = await minibone.encrypt(unicodeString) 189 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(unicodeString) 190 | }) 191 | 192 | test('can encrypt and decrypt arrays with mixed data types', async () => { 193 | const minibone = await Minibone.create() 194 | const mixedArray = [1, 'hello', true, null, { key: 'value' }] 195 | const ciphertext = await minibone.encrypt(mixedArray) 196 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(mixedArray) 197 | }) 198 | 199 | test('throws an error when trying to encrypt non-serializable values', async () => { 200 | const minibone = await Minibone.create() 201 | const nonSerializableValue = () => {} 202 | await expect(minibone.encrypt(nonSerializableValue)).rejects.toThrow() 203 | }) 204 | 205 | test('can encrypt and decrypt extremely long strings', async () => { 206 | const minibone = await Minibone.create() 207 | const longString = 'a'.repeat(1024 * 1024) // 1 MB string 208 | const ciphertext = await minibone.encrypt(longString) 209 | await expect(minibone.decrypt(ciphertext)).resolves.toEqual(longString) 210 | }) 211 | 212 | test('can encrypt and decrypt with empty context', async () => { 213 | const minibone = await Minibone.create() 214 | const ciphertext = await minibone.encrypt(data) 215 | const exported = await minibone.save('minibone-secure-phrase', []) 216 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', []) 217 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 218 | }) 219 | 220 | test('can encrypt and decrypt with empty context', async () => { 221 | const minibone = await Minibone.create() 222 | const ciphertext = await minibone.encrypt(data) 223 | const exported = await minibone.save('minibone-secure-phrase', []) 224 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', []) 225 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 226 | }) 227 | 228 | test('can encrypt and decrypt with extremely long context', async () => { 229 | const minibone = await Minibone.create() 230 | const longContext = ['a'.repeat(1024 * 1024)] // 1 MB context 231 | const ciphertext = await minibone.encrypt(data) 232 | const exported = await minibone.save('minibone-secure-phrase', longContext) 233 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', longContext) 234 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 235 | }) 236 | 237 | test('can encrypt and decrypt with extremely long context', async () => { 238 | const minibone = await Minibone.create() 239 | const longContext = ['a'.repeat(1024 * 1024)] // 1 MB context 240 | const ciphertext = await minibone.encrypt(data) 241 | const exported = await minibone.save('minibone-secure-phrase', longContext) 242 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', longContext) 243 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 244 | }) 245 | 246 | test('can encrypt and decrypt with non-ASCII characters in context', async () => { 247 | const minibone = await Minibone.create() 248 | const nonASCIIContext = ['你好,世界!'] 249 | const ciphertext = await minibone.encrypt(data) 250 | const exported = await minibone.save('minibone-secure-phrase', nonASCIIContext) 251 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', nonASCIIContext) 252 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 253 | }) 254 | 255 | test('can encrypt and decrypt with special characters in context', async () => { 256 | const minibone = await Minibone.create() 257 | const specialCharContext = ['!@#$%^&*()_+{}[]|\\:;"<>,.?/'] 258 | const ciphertext = await minibone.encrypt(data) 259 | const exported = await minibone.save('minibone-secure-phrase', specialCharContext) 260 | const miniboneImported = await Minibone.load(exported, 'minibone-secure-phrase', specialCharContext) 261 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 262 | }) 263 | 264 | test('can encrypt and decrypt with extremely short secrets', async () => { 265 | const minibone = await Minibone.create() 266 | const shortSecret = 'a' 267 | const ciphertext = await minibone.encrypt(data) 268 | const exported = await minibone.save(shortSecret, ['test']) 269 | const miniboneImported = await Minibone.load(exported, shortSecret, ['test']) 270 | await expect(miniboneImported.decrypt(ciphertext)).resolves.toEqual(data) 271 | }) 272 | 273 | test('encodes null correctly', () => { 274 | const encoded = encodeCanonical(null) 275 | expect(encoded).toEqual(new Uint8Array([0x00])) 276 | }) 277 | 278 | test('encodes true correctly', () => { 279 | const encoded = encodeCanonical(true) 280 | expect(encoded).toEqual(new Uint8Array([0x01, 0x01])) 281 | }) 282 | 283 | test('encodes false correctly', () => { 284 | const encoded = encodeCanonical(false) 285 | expect(encoded).toEqual(new Uint8Array([0x01, 0x00])) 286 | }) 287 | 288 | test('encodes a 32-bit unsigned integer correctly', () => { 289 | const encoded = encodeCanonical(1234567890) 290 | expect(encoded).toEqual(new Uint8Array([0x02, 0xd2, 0x02, 0x96, 0x49])) 291 | }) 292 | 293 | test('throws an error when encoding a negative integer', () => { 294 | expect(() => encodeCanonical(-1)).toThrow('Input is not a 32-bit unsigned integer') 295 | }) 296 | 297 | test('throws an error when encoding a non-integer number', () => { 298 | expect(() => encodeCanonical(3.14)).toThrow('Input is not a 32-bit unsigned integer') 299 | }) 300 | 301 | test('throws an error when encoding a number greater than 2^32 - 1', () => { 302 | expect(() => encodeCanonical(4294967296)).toThrow('Input is not a 32-bit unsigned integer') 303 | }) 304 | 305 | test('encodes a Uint8Array correctly', () => { 306 | const data = new Uint8Array([1, 2, 3, 4, 5]) 307 | const encoded = encodeCanonical(data) 308 | expect(encoded).toEqual(new Uint8Array([0x10, 0x05, 0x00, 0x00, 0x00, 1, 2, 3, 4, 5])) 309 | }) 310 | 311 | test('throws an error when encoding a Uint8Array with length greater than 2^32 - 1', () => { 312 | const largeData = new Uint8Array(4294967296) 313 | expect(() => encodeCanonical(largeData)).toThrow('Uint8Array length exceeds 32-bit integer limit') 314 | }) 315 | 316 | test('encodes an array of mixed types correctly', () => { 317 | const data = [null, true, 42, new Uint8Array([1, 2, 3]), 'hello'] 318 | const encoded = encodeCanonical(data) 319 | expect(encoded).toEqual( 320 | new Uint8Array([ 321 | 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x2a, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 1, 322 | 2, 3, 0x11, 0x05, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f 323 | ]) 324 | ) 325 | }) 326 | 327 | test('throws an error when encoding a negative number', () => { 328 | expect(() => encodeCanonical(-1)).toThrow('Input is not a 32-bit unsigned integer') 329 | }) 330 | 331 | test('throws an error when encoding a number greater than 4294967295', () => { 332 | expect(() => encodeCanonical(4294967296)).toThrow('Input is not a 32-bit unsigned integer') 333 | }) 334 | 335 | test('throws an error when encoding a Uint8Array exceeding the 32-bit integer limit', () => { 336 | const largeUint8Array = new Uint8Array(4294967296) 337 | expect(() => encodeCanonical(largeUint8Array)).toThrow('Uint8Array length exceeds 32-bit integer limit') 338 | }) 339 | 340 | test('throws an error when loading with an unrecognized envelope payload', async () => { 341 | const invalidEnvelope = { invalid: true } 342 | const encodedInvalidEnvelope = encodeCbor(invalidEnvelope) 343 | await expect(Minibone.load(encodedInvalidEnvelope, 'minibone-secure-phrase', ['test'])).rejects.toThrow( 344 | 'Unrecognised envelope payload' 345 | ) 346 | }) 347 | 348 | test('throws an error when loading with an unrecognized bundle payload', async () => { 349 | const invalidBundle = { invalid: true, padding: 'abcdefghijklmnopqrstuvwxyz' } 350 | const encodedInvalidBundle = encodeCbor(invalidBundle) 351 | const envelope = { 352 | v0: { 353 | revision: 1, 354 | iv: new Uint8Array(12), 355 | ciphertext: encodedInvalidBundle 356 | } 357 | } 358 | const encodedEnvelope = encodeCbor(envelope) 359 | await expect(Minibone.load(encodedEnvelope, 'minibone-secure-phrase', ['test'])).rejects.toThrow( 360 | 'The operation failed for an operation-specific reason' 361 | ) 362 | }) 363 | 364 | test('throws an error when decrypting with an unrecognized encrypted payload', async () => { 365 | const minibone = await Minibone.create() 366 | const invalidEncrypted = { invalid: true } 367 | const encodedInvalidEncrypted = encodeCbor(invalidEncrypted) 368 | await expect(minibone.decrypt(encodedInvalidEncrypted)).rejects.toThrow('Unrecognised encrypted payload') 369 | }) 370 | }) 371 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* https://aka.ms/tsconfig.json */ 4 | 5 | /* Basic Options */ 6 | "target": "esnext", 7 | "module": "esnext", 8 | "declaration": false, 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | "outDir": "dist", 12 | 13 | /* Strict Type-Checking Options */ 14 | "strict": true, 15 | "forceConsistentCasingInFileNames": true, 16 | 17 | /* Module Resolution Options */ 18 | "moduleResolution": "node", 19 | "esModuleInterop": true, 20 | }, 21 | "include": [ 22 | "src/**/*.ts", 23 | "src/**/*.d.ts", 24 | ], 25 | "exclude": [ 26 | "node_modules", 27 | ] 28 | } 29 | --------------------------------------------------------------------------------