├── .gitignore ├── .npmignore ├── README.md ├── docs └── developer-info.md ├── package-lock.json ├── package.json ├── src ├── index.js └── watch_protobuf.js └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | .history/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Touch SDK Web 2 | 3 | ![npm](https://img.shields.io/npm/v/touch-sdk) 4 | ![npm bundle size](https://img.shields.io/bundlephobia/min/touch-sdk) 5 | ![NPM](https://img.shields.io/npm/l/touch-sdk) 6 | ![npm downloads](https://img.shields.io/npm/dm/touch-sdk) 7 | ![Discord](https://img.shields.io/discord/869474617729875998) 8 | 9 | Connects to Doublepoint Touch SDK compatible Bluetooth devices – like [this WearOS app](https://play.google.com/store/apps/details?id=io.port6.watchbridge). 10 | 11 | Works with Chrome-based browsers. ([more info](https://caniuse.com/?search=bluetooth)) 12 | 13 | ## Importing (URL) 14 | 15 | ```html 16 | 17 | ``` 18 | 19 | ```javascript 20 | const Watch = TouchSDK.Watch 21 | ``` 22 | 23 | ## Importing (NPM) 24 | ```sh 25 | npm install touch-sdk 26 | ``` 27 | 28 | ```javascript 29 | import { Watch } from 'touch-sdk' 30 | ``` 31 | 32 | ## Example using URL import 33 | 34 | ```javascript 35 | 36 | 37 | 38 | 39 | 40 | 41 | 51 | 52 | 53 | ``` 54 | 55 | ## Reference 56 | 57 | ### Connection 58 | 59 | #### `watch.createConnectButton` 60 | 61 | Returns a button element with the following properties: 62 | - `onclick` calls `watch.requestConnection` 63 | - Text: Connect Touch SDK Controller 64 | - Class (for CSS): `touch-sdk-connect-button` 65 | - When the user selects a Touch SDK compatible device, the button is hidden. 66 | - When the watch disconnects, the button is shown again. 67 | 68 | This function does not add the button to the DOM. 69 | 70 | #### `watch.requestConnection` 71 | Can only be called as a result of a user action, for example a button click. Otherwise doesn't do anything. 72 | 73 | ```javascript 74 | watch.requestConnection().then(() => { 75 | console.log('connected') 76 | }, error => { 77 | alert(error.message) 78 | }) 79 | ``` 80 | 81 | ### Input events 82 | 83 | #### Gesture prediction 84 | 85 | ```javascript 86 | watch.addEventListener('tap', (event) => { 87 | console.log('tap') 88 | }) 89 | 90 | ```javascript 91 | watch.addEventListener('probability', (event) => { 92 | console.log("gesture probability:", event.detail) 93 | }) 94 | ``` 95 | 96 | #### Ray casting (arm direction) 97 | ```javascript 98 | watch.addEventListener('armdirectionchanged', event => { 99 | const { dx, dy } = event.detail 100 | console.log(dx, dy) 101 | }) 102 | ``` 103 | 104 | #### Raw motion (IMU) 105 | 106 | All applicable units are SI-based. 107 | 108 | ##### Acceleration 109 | ```javascript 110 | watch.addEventListener('accelerationchanged', (event) => { 111 | const { x, y, z } = event.detail 112 | console.log(x, y, z) 113 | }) 114 | ``` 115 | 116 | ##### Rotation (gyroscope) 117 | ```javascript 118 | watch.addEventListener('angularvelocitychanged', (event) => { 119 | const { x, y, z } = event.detail 120 | console.log(x, y, z) 121 | }) 122 | ``` 123 | 124 | ##### Gravity Vector 125 | ```javascript 126 | watch.addEventListener('gravityvectorchanged', (event) => { 127 | const { x, y, z } = event.detail 128 | console.log(x, y, z) 129 | }) 130 | ``` 131 | 132 | ##### Orientation (quaternion) 133 | ```javascript 134 | watch.addEventListener('orientationchanged', (event) => { 135 | const { x, y, z, w } = event.detail 136 | console.log(x, y, z, w) 137 | }) 138 | ``` 139 | 140 | #### Touch Screen 141 | 142 | ##### Touch Start 143 | ```javascript 144 | watch.addEventListener('touchstart', (event) => { 145 | const { x, y } = event.detail 146 | console.log(x, y) 147 | }) 148 | ``` 149 | 150 | ##### Touch Move 151 | ```javascript 152 | watch.addEventListener('touchmove', (event) => { 153 | const { x, y } = event.detail 154 | console.log(x, y) 155 | }) 156 | ``` 157 | 158 | ##### Touch End 159 | ```javascript 160 | watch.addEventListener('touchend', (event) => { 161 | const { x, y } = event.detail 162 | console.log(x, y) 163 | }) 164 | ``` 165 | 166 | ##### Touch Cancel 167 | For example the user swiped from the edge of the screen, and triggered an operating system gesture. Usually `touchcancel` should be handled the same way as `touchend`. 168 | ```javascript 169 | watch.addEventListener('touchcancel', (event) => { 170 | const { x, y } = event.detail 171 | console.log(x, y) 172 | }) 173 | ``` 174 | 175 | #### Mechanical 176 | 177 | ##### Rotary Dial 178 | ```javascript 179 | watch.addEventListener('rotary', (event) => { 180 | const { step } = event.detail 181 | console.log(step) 182 | }) 183 | ``` 184 | 185 | ##### Button 186 | In Wear OS this is the back button. Only clicks are registered, no button down and button up events. 187 | ```javascript 188 | watch.addEventListener('button', (event) => { 189 | console.log('button') 190 | }) 191 | ``` 192 | 193 | #### Miscellaneous 194 | After the `connected` event, several watch properties become available. 195 | ```javascript 196 | watch.addEventListener('connected', (event) => { 197 | watch.hand // 'left' or 'right' 198 | watch.hapticsAvailable // true or false 199 | watch.touchScreenResolution // (width, height). (0, 0) if no touch screen 200 | watch.batteryPercentage // 0-100 201 | }) 202 | ``` 203 | 204 | ### Output 205 | #### Haptics 206 | Intensity is between 0 and 1. 207 | Length is milliseconds, between 0 and 5000. 208 | ```javascript 209 | watch.triggerHaptics(intensity, length) 210 | ``` 211 | 212 | ## Developing: build a new version 213 | ``` 214 | npm install 215 | npm run build 216 | npm publish 217 | ``` 218 | -------------------------------------------------------------------------------- /docs/developer-info.md: -------------------------------------------------------------------------------- 1 | # Developer info 2 | 3 | [Instructions for generating the static protobuf files](https://www.notion.so/port6/Instructions-for-static-JS-protobuf-file-generation-508e0dd9379548518821b2d04aed7bb6) (`watch_protobuf.js`) 4 | 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "touch-sdk", 3 | "version": "0.6.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "touch-sdk", 9 | "version": "0.6.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "protobufjs": "^7.1.2", 13 | "ua-parser-js": "^1.0.32" 14 | }, 15 | "devDependencies": { 16 | "webpack": "^5.75.0", 17 | "webpack-cli": "^5.0.0" 18 | } 19 | }, 20 | "node_modules/@discoveryjs/json-ext": { 21 | "version": "0.5.7", 22 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", 23 | "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", 24 | "dev": true, 25 | "engines": { 26 | "node": ">=10.0.0" 27 | } 28 | }, 29 | "node_modules/@jridgewell/gen-mapping": { 30 | "version": "0.3.3", 31 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 32 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 33 | "dev": true, 34 | "dependencies": { 35 | "@jridgewell/set-array": "^1.0.1", 36 | "@jridgewell/sourcemap-codec": "^1.4.10", 37 | "@jridgewell/trace-mapping": "^0.3.9" 38 | }, 39 | "engines": { 40 | "node": ">=6.0.0" 41 | } 42 | }, 43 | "node_modules/@jridgewell/resolve-uri": { 44 | "version": "3.1.0", 45 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 46 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 47 | "dev": true, 48 | "engines": { 49 | "node": ">=6.0.0" 50 | } 51 | }, 52 | "node_modules/@jridgewell/set-array": { 53 | "version": "1.1.2", 54 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 55 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 56 | "dev": true, 57 | "engines": { 58 | "node": ">=6.0.0" 59 | } 60 | }, 61 | "node_modules/@jridgewell/source-map": { 62 | "version": "0.3.3", 63 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", 64 | "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", 65 | "dev": true, 66 | "dependencies": { 67 | "@jridgewell/gen-mapping": "^0.3.0", 68 | "@jridgewell/trace-mapping": "^0.3.9" 69 | } 70 | }, 71 | "node_modules/@jridgewell/sourcemap-codec": { 72 | "version": "1.4.14", 73 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 74 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 75 | "dev": true 76 | }, 77 | "node_modules/@jridgewell/trace-mapping": { 78 | "version": "0.3.18", 79 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 80 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 81 | "dev": true, 82 | "dependencies": { 83 | "@jridgewell/resolve-uri": "3.1.0", 84 | "@jridgewell/sourcemap-codec": "1.4.14" 85 | } 86 | }, 87 | "node_modules/@protobufjs/aspromise": { 88 | "version": "1.1.2", 89 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 90 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 91 | }, 92 | "node_modules/@protobufjs/base64": { 93 | "version": "1.1.2", 94 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 95 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 96 | }, 97 | "node_modules/@protobufjs/codegen": { 98 | "version": "2.0.4", 99 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 100 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 101 | }, 102 | "node_modules/@protobufjs/eventemitter": { 103 | "version": "1.1.0", 104 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 105 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 106 | }, 107 | "node_modules/@protobufjs/fetch": { 108 | "version": "1.1.0", 109 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 110 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 111 | "dependencies": { 112 | "@protobufjs/aspromise": "^1.1.1", 113 | "@protobufjs/inquire": "^1.1.0" 114 | } 115 | }, 116 | "node_modules/@protobufjs/float": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 119 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 120 | }, 121 | "node_modules/@protobufjs/inquire": { 122 | "version": "1.1.0", 123 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 124 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 125 | }, 126 | "node_modules/@protobufjs/path": { 127 | "version": "1.1.2", 128 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 129 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 130 | }, 131 | "node_modules/@protobufjs/pool": { 132 | "version": "1.1.0", 133 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 134 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 135 | }, 136 | "node_modules/@protobufjs/utf8": { 137 | "version": "1.1.0", 138 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 139 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 140 | }, 141 | "node_modules/@types/eslint": { 142 | "version": "8.4.10", 143 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", 144 | "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", 145 | "dev": true, 146 | "dependencies": { 147 | "@types/estree": "*", 148 | "@types/json-schema": "*" 149 | } 150 | }, 151 | "node_modules/@types/eslint-scope": { 152 | "version": "3.7.4", 153 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", 154 | "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", 155 | "dev": true, 156 | "dependencies": { 157 | "@types/eslint": "*", 158 | "@types/estree": "*" 159 | } 160 | }, 161 | "node_modules/@types/estree": { 162 | "version": "1.0.1", 163 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", 164 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", 165 | "dev": true 166 | }, 167 | "node_modules/@types/json-schema": { 168 | "version": "7.0.11", 169 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 170 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 171 | "dev": true 172 | }, 173 | "node_modules/@types/node": { 174 | "version": "18.11.15", 175 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", 176 | "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" 177 | }, 178 | "node_modules/@webassemblyjs/ast": { 179 | "version": "1.11.6", 180 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", 181 | "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", 182 | "dev": true, 183 | "dependencies": { 184 | "@webassemblyjs/helper-numbers": "1.11.6", 185 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6" 186 | } 187 | }, 188 | "node_modules/@webassemblyjs/floating-point-hex-parser": { 189 | "version": "1.11.6", 190 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", 191 | "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", 192 | "dev": true 193 | }, 194 | "node_modules/@webassemblyjs/helper-api-error": { 195 | "version": "1.11.6", 196 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", 197 | "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", 198 | "dev": true 199 | }, 200 | "node_modules/@webassemblyjs/helper-buffer": { 201 | "version": "1.11.6", 202 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", 203 | "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", 204 | "dev": true 205 | }, 206 | "node_modules/@webassemblyjs/helper-numbers": { 207 | "version": "1.11.6", 208 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", 209 | "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", 210 | "dev": true, 211 | "dependencies": { 212 | "@webassemblyjs/floating-point-hex-parser": "1.11.6", 213 | "@webassemblyjs/helper-api-error": "1.11.6", 214 | "@xtuc/long": "4.2.2" 215 | } 216 | }, 217 | "node_modules/@webassemblyjs/helper-wasm-bytecode": { 218 | "version": "1.11.6", 219 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", 220 | "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", 221 | "dev": true 222 | }, 223 | "node_modules/@webassemblyjs/helper-wasm-section": { 224 | "version": "1.11.6", 225 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", 226 | "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", 227 | "dev": true, 228 | "dependencies": { 229 | "@webassemblyjs/ast": "1.11.6", 230 | "@webassemblyjs/helper-buffer": "1.11.6", 231 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 232 | "@webassemblyjs/wasm-gen": "1.11.6" 233 | } 234 | }, 235 | "node_modules/@webassemblyjs/ieee754": { 236 | "version": "1.11.6", 237 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", 238 | "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", 239 | "dev": true, 240 | "dependencies": { 241 | "@xtuc/ieee754": "^1.2.0" 242 | } 243 | }, 244 | "node_modules/@webassemblyjs/leb128": { 245 | "version": "1.11.6", 246 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", 247 | "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", 248 | "dev": true, 249 | "dependencies": { 250 | "@xtuc/long": "4.2.2" 251 | } 252 | }, 253 | "node_modules/@webassemblyjs/utf8": { 254 | "version": "1.11.6", 255 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", 256 | "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", 257 | "dev": true 258 | }, 259 | "node_modules/@webassemblyjs/wasm-edit": { 260 | "version": "1.11.6", 261 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", 262 | "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", 263 | "dev": true, 264 | "dependencies": { 265 | "@webassemblyjs/ast": "1.11.6", 266 | "@webassemblyjs/helper-buffer": "1.11.6", 267 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 268 | "@webassemblyjs/helper-wasm-section": "1.11.6", 269 | "@webassemblyjs/wasm-gen": "1.11.6", 270 | "@webassemblyjs/wasm-opt": "1.11.6", 271 | "@webassemblyjs/wasm-parser": "1.11.6", 272 | "@webassemblyjs/wast-printer": "1.11.6" 273 | } 274 | }, 275 | "node_modules/@webassemblyjs/wasm-gen": { 276 | "version": "1.11.6", 277 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", 278 | "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", 279 | "dev": true, 280 | "dependencies": { 281 | "@webassemblyjs/ast": "1.11.6", 282 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 283 | "@webassemblyjs/ieee754": "1.11.6", 284 | "@webassemblyjs/leb128": "1.11.6", 285 | "@webassemblyjs/utf8": "1.11.6" 286 | } 287 | }, 288 | "node_modules/@webassemblyjs/wasm-opt": { 289 | "version": "1.11.6", 290 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", 291 | "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", 292 | "dev": true, 293 | "dependencies": { 294 | "@webassemblyjs/ast": "1.11.6", 295 | "@webassemblyjs/helper-buffer": "1.11.6", 296 | "@webassemblyjs/wasm-gen": "1.11.6", 297 | "@webassemblyjs/wasm-parser": "1.11.6" 298 | } 299 | }, 300 | "node_modules/@webassemblyjs/wasm-parser": { 301 | "version": "1.11.6", 302 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", 303 | "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", 304 | "dev": true, 305 | "dependencies": { 306 | "@webassemblyjs/ast": "1.11.6", 307 | "@webassemblyjs/helper-api-error": "1.11.6", 308 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 309 | "@webassemblyjs/ieee754": "1.11.6", 310 | "@webassemblyjs/leb128": "1.11.6", 311 | "@webassemblyjs/utf8": "1.11.6" 312 | } 313 | }, 314 | "node_modules/@webassemblyjs/wast-printer": { 315 | "version": "1.11.6", 316 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", 317 | "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", 318 | "dev": true, 319 | "dependencies": { 320 | "@webassemblyjs/ast": "1.11.6", 321 | "@xtuc/long": "4.2.2" 322 | } 323 | }, 324 | "node_modules/@webpack-cli/configtest": { 325 | "version": "2.0.1", 326 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", 327 | "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", 328 | "dev": true, 329 | "engines": { 330 | "node": ">=14.15.0" 331 | }, 332 | "peerDependencies": { 333 | "webpack": "5.x.x", 334 | "webpack-cli": "5.x.x" 335 | } 336 | }, 337 | "node_modules/@webpack-cli/info": { 338 | "version": "2.0.1", 339 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", 340 | "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", 341 | "dev": true, 342 | "engines": { 343 | "node": ">=14.15.0" 344 | }, 345 | "peerDependencies": { 346 | "webpack": "5.x.x", 347 | "webpack-cli": "5.x.x" 348 | } 349 | }, 350 | "node_modules/@webpack-cli/serve": { 351 | "version": "2.0.1", 352 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", 353 | "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", 354 | "dev": true, 355 | "engines": { 356 | "node": ">=14.15.0" 357 | }, 358 | "peerDependencies": { 359 | "webpack": "5.x.x", 360 | "webpack-cli": "5.x.x" 361 | }, 362 | "peerDependenciesMeta": { 363 | "webpack-dev-server": { 364 | "optional": true 365 | } 366 | } 367 | }, 368 | "node_modules/@xtuc/ieee754": { 369 | "version": "1.2.0", 370 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 371 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 372 | "dev": true 373 | }, 374 | "node_modules/@xtuc/long": { 375 | "version": "4.2.2", 376 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 377 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 378 | "dev": true 379 | }, 380 | "node_modules/acorn": { 381 | "version": "8.8.1", 382 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", 383 | "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", 384 | "dev": true, 385 | "bin": { 386 | "acorn": "bin/acorn" 387 | }, 388 | "engines": { 389 | "node": ">=0.4.0" 390 | } 391 | }, 392 | "node_modules/acorn-import-assertions": { 393 | "version": "1.8.0", 394 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", 395 | "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", 396 | "dev": true, 397 | "peerDependencies": { 398 | "acorn": "^8" 399 | } 400 | }, 401 | "node_modules/ajv": { 402 | "version": "6.12.6", 403 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 404 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 405 | "dev": true, 406 | "dependencies": { 407 | "fast-deep-equal": "^3.1.1", 408 | "fast-json-stable-stringify": "^2.0.0", 409 | "json-schema-traverse": "^0.4.1", 410 | "uri-js": "^4.2.2" 411 | }, 412 | "funding": { 413 | "type": "github", 414 | "url": "https://github.com/sponsors/epoberezkin" 415 | } 416 | }, 417 | "node_modules/ajv-keywords": { 418 | "version": "3.5.2", 419 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 420 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 421 | "dev": true, 422 | "peerDependencies": { 423 | "ajv": "^6.9.1" 424 | } 425 | }, 426 | "node_modules/browserslist": { 427 | "version": "4.21.4", 428 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 429 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 430 | "dev": true, 431 | "funding": [ 432 | { 433 | "type": "opencollective", 434 | "url": "https://opencollective.com/browserslist" 435 | }, 436 | { 437 | "type": "tidelift", 438 | "url": "https://tidelift.com/funding/github/npm/browserslist" 439 | } 440 | ], 441 | "dependencies": { 442 | "caniuse-lite": "^1.0.30001400", 443 | "electron-to-chromium": "^1.4.251", 444 | "node-releases": "^2.0.6", 445 | "update-browserslist-db": "^1.0.9" 446 | }, 447 | "bin": { 448 | "browserslist": "cli.js" 449 | }, 450 | "engines": { 451 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 452 | } 453 | }, 454 | "node_modules/buffer-from": { 455 | "version": "1.1.2", 456 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 457 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 458 | "dev": true 459 | }, 460 | "node_modules/caniuse-lite": { 461 | "version": "1.0.30001439", 462 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", 463 | "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", 464 | "dev": true, 465 | "funding": [ 466 | { 467 | "type": "opencollective", 468 | "url": "https://opencollective.com/browserslist" 469 | }, 470 | { 471 | "type": "tidelift", 472 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 473 | } 474 | ] 475 | }, 476 | "node_modules/chrome-trace-event": { 477 | "version": "1.0.3", 478 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", 479 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", 480 | "dev": true, 481 | "engines": { 482 | "node": ">=6.0" 483 | } 484 | }, 485 | "node_modules/clone-deep": { 486 | "version": "4.0.1", 487 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 488 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 489 | "dev": true, 490 | "dependencies": { 491 | "is-plain-object": "^2.0.4", 492 | "kind-of": "^6.0.2", 493 | "shallow-clone": "^3.0.0" 494 | }, 495 | "engines": { 496 | "node": ">=6" 497 | } 498 | }, 499 | "node_modules/colorette": { 500 | "version": "2.0.19", 501 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", 502 | "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", 503 | "dev": true 504 | }, 505 | "node_modules/commander": { 506 | "version": "2.20.3", 507 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 508 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 509 | "dev": true 510 | }, 511 | "node_modules/cross-spawn": { 512 | "version": "7.0.3", 513 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 514 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 515 | "dev": true, 516 | "dependencies": { 517 | "path-key": "^3.1.0", 518 | "shebang-command": "^2.0.0", 519 | "which": "^2.0.1" 520 | }, 521 | "engines": { 522 | "node": ">= 8" 523 | } 524 | }, 525 | "node_modules/electron-to-chromium": { 526 | "version": "1.4.284", 527 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 528 | "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 529 | "dev": true 530 | }, 531 | "node_modules/enhanced-resolve": { 532 | "version": "5.14.0", 533 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", 534 | "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", 535 | "dev": true, 536 | "dependencies": { 537 | "graceful-fs": "^4.2.4", 538 | "tapable": "^2.2.0" 539 | }, 540 | "engines": { 541 | "node": ">=10.13.0" 542 | } 543 | }, 544 | "node_modules/envinfo": { 545 | "version": "7.8.1", 546 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", 547 | "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", 548 | "dev": true, 549 | "bin": { 550 | "envinfo": "dist/cli.js" 551 | }, 552 | "engines": { 553 | "node": ">=4" 554 | } 555 | }, 556 | "node_modules/es-module-lexer": { 557 | "version": "1.2.1", 558 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", 559 | "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", 560 | "dev": true 561 | }, 562 | "node_modules/escalade": { 563 | "version": "3.1.1", 564 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 565 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 566 | "dev": true, 567 | "engines": { 568 | "node": ">=6" 569 | } 570 | }, 571 | "node_modules/eslint-scope": { 572 | "version": "5.1.1", 573 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 574 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 575 | "dev": true, 576 | "dependencies": { 577 | "esrecurse": "^4.3.0", 578 | "estraverse": "^4.1.1" 579 | }, 580 | "engines": { 581 | "node": ">=8.0.0" 582 | } 583 | }, 584 | "node_modules/esrecurse": { 585 | "version": "4.3.0", 586 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 587 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 588 | "dev": true, 589 | "dependencies": { 590 | "estraverse": "^5.2.0" 591 | }, 592 | "engines": { 593 | "node": ">=4.0" 594 | } 595 | }, 596 | "node_modules/esrecurse/node_modules/estraverse": { 597 | "version": "5.3.0", 598 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 599 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 600 | "dev": true, 601 | "engines": { 602 | "node": ">=4.0" 603 | } 604 | }, 605 | "node_modules/estraverse": { 606 | "version": "4.3.0", 607 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 608 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 609 | "dev": true, 610 | "engines": { 611 | "node": ">=4.0" 612 | } 613 | }, 614 | "node_modules/events": { 615 | "version": "3.3.0", 616 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 617 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 618 | "dev": true, 619 | "engines": { 620 | "node": ">=0.8.x" 621 | } 622 | }, 623 | "node_modules/fast-deep-equal": { 624 | "version": "3.1.3", 625 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 626 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 627 | "dev": true 628 | }, 629 | "node_modules/fast-json-stable-stringify": { 630 | "version": "2.1.0", 631 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 632 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 633 | "dev": true 634 | }, 635 | "node_modules/fastest-levenshtein": { 636 | "version": "1.0.16", 637 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 638 | "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 639 | "dev": true, 640 | "engines": { 641 | "node": ">= 4.9.1" 642 | } 643 | }, 644 | "node_modules/find-up": { 645 | "version": "4.1.0", 646 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 647 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 648 | "dev": true, 649 | "dependencies": { 650 | "locate-path": "^5.0.0", 651 | "path-exists": "^4.0.0" 652 | }, 653 | "engines": { 654 | "node": ">=8" 655 | } 656 | }, 657 | "node_modules/function-bind": { 658 | "version": "1.1.1", 659 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 660 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 661 | "dev": true 662 | }, 663 | "node_modules/glob-to-regexp": { 664 | "version": "0.4.1", 665 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 666 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 667 | "dev": true 668 | }, 669 | "node_modules/graceful-fs": { 670 | "version": "4.2.10", 671 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 672 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 673 | "dev": true 674 | }, 675 | "node_modules/has": { 676 | "version": "1.0.3", 677 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 678 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 679 | "dev": true, 680 | "dependencies": { 681 | "function-bind": "^1.1.1" 682 | }, 683 | "engines": { 684 | "node": ">= 0.4.0" 685 | } 686 | }, 687 | "node_modules/has-flag": { 688 | "version": "4.0.0", 689 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 690 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 691 | "dev": true, 692 | "engines": { 693 | "node": ">=8" 694 | } 695 | }, 696 | "node_modules/import-local": { 697 | "version": "3.1.0", 698 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 699 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 700 | "dev": true, 701 | "dependencies": { 702 | "pkg-dir": "^4.2.0", 703 | "resolve-cwd": "^3.0.0" 704 | }, 705 | "bin": { 706 | "import-local-fixture": "fixtures/cli.js" 707 | }, 708 | "engines": { 709 | "node": ">=8" 710 | }, 711 | "funding": { 712 | "url": "https://github.com/sponsors/sindresorhus" 713 | } 714 | }, 715 | "node_modules/interpret": { 716 | "version": "3.1.1", 717 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", 718 | "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", 719 | "dev": true, 720 | "engines": { 721 | "node": ">=10.13.0" 722 | } 723 | }, 724 | "node_modules/is-core-module": { 725 | "version": "2.11.0", 726 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 727 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 728 | "dev": true, 729 | "dependencies": { 730 | "has": "^1.0.3" 731 | }, 732 | "funding": { 733 | "url": "https://github.com/sponsors/ljharb" 734 | } 735 | }, 736 | "node_modules/is-plain-object": { 737 | "version": "2.0.4", 738 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 739 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 740 | "dev": true, 741 | "dependencies": { 742 | "isobject": "^3.0.1" 743 | }, 744 | "engines": { 745 | "node": ">=0.10.0" 746 | } 747 | }, 748 | "node_modules/isexe": { 749 | "version": "2.0.0", 750 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 751 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 752 | "dev": true 753 | }, 754 | "node_modules/isobject": { 755 | "version": "3.0.1", 756 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 757 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 758 | "dev": true, 759 | "engines": { 760 | "node": ">=0.10.0" 761 | } 762 | }, 763 | "node_modules/jest-worker": { 764 | "version": "27.5.1", 765 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 766 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 767 | "dev": true, 768 | "dependencies": { 769 | "@types/node": "*", 770 | "merge-stream": "^2.0.0", 771 | "supports-color": "^8.0.0" 772 | }, 773 | "engines": { 774 | "node": ">= 10.13.0" 775 | } 776 | }, 777 | "node_modules/json-parse-even-better-errors": { 778 | "version": "2.3.1", 779 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 780 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 781 | "dev": true 782 | }, 783 | "node_modules/json-schema-traverse": { 784 | "version": "0.4.1", 785 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 786 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 787 | "dev": true 788 | }, 789 | "node_modules/kind-of": { 790 | "version": "6.0.3", 791 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 792 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 793 | "dev": true, 794 | "engines": { 795 | "node": ">=0.10.0" 796 | } 797 | }, 798 | "node_modules/loader-runner": { 799 | "version": "4.3.0", 800 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 801 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 802 | "dev": true, 803 | "engines": { 804 | "node": ">=6.11.5" 805 | } 806 | }, 807 | "node_modules/locate-path": { 808 | "version": "5.0.0", 809 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 810 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 811 | "dev": true, 812 | "dependencies": { 813 | "p-locate": "^4.1.0" 814 | }, 815 | "engines": { 816 | "node": ">=8" 817 | } 818 | }, 819 | "node_modules/long": { 820 | "version": "5.2.1", 821 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", 822 | "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" 823 | }, 824 | "node_modules/merge-stream": { 825 | "version": "2.0.0", 826 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 827 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 828 | "dev": true 829 | }, 830 | "node_modules/mime-db": { 831 | "version": "1.52.0", 832 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 833 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 834 | "dev": true, 835 | "engines": { 836 | "node": ">= 0.6" 837 | } 838 | }, 839 | "node_modules/mime-types": { 840 | "version": "2.1.35", 841 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 842 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 843 | "dev": true, 844 | "dependencies": { 845 | "mime-db": "1.52.0" 846 | }, 847 | "engines": { 848 | "node": ">= 0.6" 849 | } 850 | }, 851 | "node_modules/neo-async": { 852 | "version": "2.6.2", 853 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 854 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 855 | "dev": true 856 | }, 857 | "node_modules/node-releases": { 858 | "version": "2.0.7", 859 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", 860 | "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", 861 | "dev": true 862 | }, 863 | "node_modules/p-limit": { 864 | "version": "2.3.0", 865 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 866 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 867 | "dev": true, 868 | "dependencies": { 869 | "p-try": "^2.0.0" 870 | }, 871 | "engines": { 872 | "node": ">=6" 873 | }, 874 | "funding": { 875 | "url": "https://github.com/sponsors/sindresorhus" 876 | } 877 | }, 878 | "node_modules/p-locate": { 879 | "version": "4.1.0", 880 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 881 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 882 | "dev": true, 883 | "dependencies": { 884 | "p-limit": "^2.2.0" 885 | }, 886 | "engines": { 887 | "node": ">=8" 888 | } 889 | }, 890 | "node_modules/p-try": { 891 | "version": "2.2.0", 892 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 893 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 894 | "dev": true, 895 | "engines": { 896 | "node": ">=6" 897 | } 898 | }, 899 | "node_modules/path-exists": { 900 | "version": "4.0.0", 901 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 902 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 903 | "dev": true, 904 | "engines": { 905 | "node": ">=8" 906 | } 907 | }, 908 | "node_modules/path-key": { 909 | "version": "3.1.1", 910 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 911 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 912 | "dev": true, 913 | "engines": { 914 | "node": ">=8" 915 | } 916 | }, 917 | "node_modules/path-parse": { 918 | "version": "1.0.7", 919 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 920 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 921 | "dev": true 922 | }, 923 | "node_modules/picocolors": { 924 | "version": "1.0.0", 925 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 926 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 927 | "dev": true 928 | }, 929 | "node_modules/pkg-dir": { 930 | "version": "4.2.0", 931 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 932 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 933 | "dev": true, 934 | "dependencies": { 935 | "find-up": "^4.0.0" 936 | }, 937 | "engines": { 938 | "node": ">=8" 939 | } 940 | }, 941 | "node_modules/protobufjs": { 942 | "version": "7.2.6", 943 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", 944 | "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", 945 | "hasInstallScript": true, 946 | "dependencies": { 947 | "@protobufjs/aspromise": "^1.1.2", 948 | "@protobufjs/base64": "^1.1.2", 949 | "@protobufjs/codegen": "^2.0.4", 950 | "@protobufjs/eventemitter": "^1.1.0", 951 | "@protobufjs/fetch": "^1.1.0", 952 | "@protobufjs/float": "^1.0.2", 953 | "@protobufjs/inquire": "^1.1.0", 954 | "@protobufjs/path": "^1.1.2", 955 | "@protobufjs/pool": "^1.1.0", 956 | "@protobufjs/utf8": "^1.1.0", 957 | "@types/node": ">=13.7.0", 958 | "long": "^5.0.0" 959 | }, 960 | "engines": { 961 | "node": ">=12.0.0" 962 | } 963 | }, 964 | "node_modules/punycode": { 965 | "version": "2.3.0", 966 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 967 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 968 | "dev": true, 969 | "engines": { 970 | "node": ">=6" 971 | } 972 | }, 973 | "node_modules/randombytes": { 974 | "version": "2.1.0", 975 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 976 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 977 | "dev": true, 978 | "dependencies": { 979 | "safe-buffer": "^5.1.0" 980 | } 981 | }, 982 | "node_modules/rechoir": { 983 | "version": "0.8.0", 984 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 985 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 986 | "dev": true, 987 | "dependencies": { 988 | "resolve": "^1.20.0" 989 | }, 990 | "engines": { 991 | "node": ">= 10.13.0" 992 | } 993 | }, 994 | "node_modules/resolve": { 995 | "version": "1.22.1", 996 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 997 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 998 | "dev": true, 999 | "dependencies": { 1000 | "is-core-module": "^2.9.0", 1001 | "path-parse": "^1.0.7", 1002 | "supports-preserve-symlinks-flag": "^1.0.0" 1003 | }, 1004 | "bin": { 1005 | "resolve": "bin/resolve" 1006 | }, 1007 | "funding": { 1008 | "url": "https://github.com/sponsors/ljharb" 1009 | } 1010 | }, 1011 | "node_modules/resolve-cwd": { 1012 | "version": "3.0.0", 1013 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 1014 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 1015 | "dev": true, 1016 | "dependencies": { 1017 | "resolve-from": "^5.0.0" 1018 | }, 1019 | "engines": { 1020 | "node": ">=8" 1021 | } 1022 | }, 1023 | "node_modules/resolve-from": { 1024 | "version": "5.0.0", 1025 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1026 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1027 | "dev": true, 1028 | "engines": { 1029 | "node": ">=8" 1030 | } 1031 | }, 1032 | "node_modules/safe-buffer": { 1033 | "version": "5.2.1", 1034 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1035 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1036 | "dev": true, 1037 | "funding": [ 1038 | { 1039 | "type": "github", 1040 | "url": "https://github.com/sponsors/feross" 1041 | }, 1042 | { 1043 | "type": "patreon", 1044 | "url": "https://www.patreon.com/feross" 1045 | }, 1046 | { 1047 | "type": "consulting", 1048 | "url": "https://feross.org/support" 1049 | } 1050 | ] 1051 | }, 1052 | "node_modules/schema-utils": { 1053 | "version": "3.1.2", 1054 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", 1055 | "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", 1056 | "dev": true, 1057 | "dependencies": { 1058 | "@types/json-schema": "^7.0.8", 1059 | "ajv": "^6.12.5", 1060 | "ajv-keywords": "^3.5.2" 1061 | }, 1062 | "engines": { 1063 | "node": ">= 10.13.0" 1064 | }, 1065 | "funding": { 1066 | "type": "opencollective", 1067 | "url": "https://opencollective.com/webpack" 1068 | } 1069 | }, 1070 | "node_modules/serialize-javascript": { 1071 | "version": "6.0.1", 1072 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", 1073 | "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", 1074 | "dev": true, 1075 | "dependencies": { 1076 | "randombytes": "^2.1.0" 1077 | } 1078 | }, 1079 | "node_modules/shallow-clone": { 1080 | "version": "3.0.1", 1081 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 1082 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 1083 | "dev": true, 1084 | "dependencies": { 1085 | "kind-of": "^6.0.2" 1086 | }, 1087 | "engines": { 1088 | "node": ">=8" 1089 | } 1090 | }, 1091 | "node_modules/shebang-command": { 1092 | "version": "2.0.0", 1093 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1094 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "shebang-regex": "^3.0.0" 1098 | }, 1099 | "engines": { 1100 | "node": ">=8" 1101 | } 1102 | }, 1103 | "node_modules/shebang-regex": { 1104 | "version": "3.0.0", 1105 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1106 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1107 | "dev": true, 1108 | "engines": { 1109 | "node": ">=8" 1110 | } 1111 | }, 1112 | "node_modules/source-map": { 1113 | "version": "0.6.1", 1114 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1115 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": ">=0.10.0" 1119 | } 1120 | }, 1121 | "node_modules/source-map-support": { 1122 | "version": "0.5.21", 1123 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1124 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1125 | "dev": true, 1126 | "dependencies": { 1127 | "buffer-from": "^1.0.0", 1128 | "source-map": "^0.6.0" 1129 | } 1130 | }, 1131 | "node_modules/supports-color": { 1132 | "version": "8.1.1", 1133 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1134 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1135 | "dev": true, 1136 | "dependencies": { 1137 | "has-flag": "^4.0.0" 1138 | }, 1139 | "engines": { 1140 | "node": ">=10" 1141 | }, 1142 | "funding": { 1143 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1144 | } 1145 | }, 1146 | "node_modules/supports-preserve-symlinks-flag": { 1147 | "version": "1.0.0", 1148 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1149 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1150 | "dev": true, 1151 | "engines": { 1152 | "node": ">= 0.4" 1153 | }, 1154 | "funding": { 1155 | "url": "https://github.com/sponsors/ljharb" 1156 | } 1157 | }, 1158 | "node_modules/tapable": { 1159 | "version": "2.2.1", 1160 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 1161 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 1162 | "dev": true, 1163 | "engines": { 1164 | "node": ">=6" 1165 | } 1166 | }, 1167 | "node_modules/terser": { 1168 | "version": "5.17.3", 1169 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", 1170 | "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", 1171 | "dev": true, 1172 | "dependencies": { 1173 | "@jridgewell/source-map": "^0.3.2", 1174 | "acorn": "^8.5.0", 1175 | "commander": "^2.20.0", 1176 | "source-map-support": "~0.5.20" 1177 | }, 1178 | "bin": { 1179 | "terser": "bin/terser" 1180 | }, 1181 | "engines": { 1182 | "node": ">=10" 1183 | } 1184 | }, 1185 | "node_modules/terser-webpack-plugin": { 1186 | "version": "5.3.8", 1187 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", 1188 | "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", 1189 | "dev": true, 1190 | "dependencies": { 1191 | "@jridgewell/trace-mapping": "^0.3.17", 1192 | "jest-worker": "^27.4.5", 1193 | "schema-utils": "^3.1.1", 1194 | "serialize-javascript": "^6.0.1", 1195 | "terser": "^5.16.8" 1196 | }, 1197 | "engines": { 1198 | "node": ">= 10.13.0" 1199 | }, 1200 | "funding": { 1201 | "type": "opencollective", 1202 | "url": "https://opencollective.com/webpack" 1203 | }, 1204 | "peerDependencies": { 1205 | "webpack": "^5.1.0" 1206 | }, 1207 | "peerDependenciesMeta": { 1208 | "@swc/core": { 1209 | "optional": true 1210 | }, 1211 | "esbuild": { 1212 | "optional": true 1213 | }, 1214 | "uglify-js": { 1215 | "optional": true 1216 | } 1217 | } 1218 | }, 1219 | "node_modules/ua-parser-js": { 1220 | "version": "1.0.33", 1221 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", 1222 | "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==", 1223 | "funding": [ 1224 | { 1225 | "type": "opencollective", 1226 | "url": "https://opencollective.com/ua-parser-js" 1227 | }, 1228 | { 1229 | "type": "paypal", 1230 | "url": "https://paypal.me/faisalman" 1231 | } 1232 | ], 1233 | "engines": { 1234 | "node": "*" 1235 | } 1236 | }, 1237 | "node_modules/update-browserslist-db": { 1238 | "version": "1.0.10", 1239 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 1240 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 1241 | "dev": true, 1242 | "funding": [ 1243 | { 1244 | "type": "opencollective", 1245 | "url": "https://opencollective.com/browserslist" 1246 | }, 1247 | { 1248 | "type": "tidelift", 1249 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1250 | } 1251 | ], 1252 | "dependencies": { 1253 | "escalade": "^3.1.1", 1254 | "picocolors": "^1.0.0" 1255 | }, 1256 | "bin": { 1257 | "browserslist-lint": "cli.js" 1258 | }, 1259 | "peerDependencies": { 1260 | "browserslist": ">= 4.21.0" 1261 | } 1262 | }, 1263 | "node_modules/uri-js": { 1264 | "version": "4.4.1", 1265 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1266 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "punycode": "^2.1.0" 1270 | } 1271 | }, 1272 | "node_modules/watchpack": { 1273 | "version": "2.4.0", 1274 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", 1275 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", 1276 | "dev": true, 1277 | "dependencies": { 1278 | "glob-to-regexp": "^0.4.1", 1279 | "graceful-fs": "^4.1.2" 1280 | }, 1281 | "engines": { 1282 | "node": ">=10.13.0" 1283 | } 1284 | }, 1285 | "node_modules/webpack": { 1286 | "version": "5.82.1", 1287 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", 1288 | "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", 1289 | "dev": true, 1290 | "dependencies": { 1291 | "@types/eslint-scope": "^3.7.3", 1292 | "@types/estree": "^1.0.0", 1293 | "@webassemblyjs/ast": "^1.11.5", 1294 | "@webassemblyjs/wasm-edit": "^1.11.5", 1295 | "@webassemblyjs/wasm-parser": "^1.11.5", 1296 | "acorn": "^8.7.1", 1297 | "acorn-import-assertions": "^1.7.6", 1298 | "browserslist": "^4.14.5", 1299 | "chrome-trace-event": "^1.0.2", 1300 | "enhanced-resolve": "^5.14.0", 1301 | "es-module-lexer": "^1.2.1", 1302 | "eslint-scope": "5.1.1", 1303 | "events": "^3.2.0", 1304 | "glob-to-regexp": "^0.4.1", 1305 | "graceful-fs": "^4.2.9", 1306 | "json-parse-even-better-errors": "^2.3.1", 1307 | "loader-runner": "^4.2.0", 1308 | "mime-types": "^2.1.27", 1309 | "neo-async": "^2.6.2", 1310 | "schema-utils": "^3.1.2", 1311 | "tapable": "^2.1.1", 1312 | "terser-webpack-plugin": "^5.3.7", 1313 | "watchpack": "^2.4.0", 1314 | "webpack-sources": "^3.2.3" 1315 | }, 1316 | "bin": { 1317 | "webpack": "bin/webpack.js" 1318 | }, 1319 | "engines": { 1320 | "node": ">=10.13.0" 1321 | }, 1322 | "funding": { 1323 | "type": "opencollective", 1324 | "url": "https://opencollective.com/webpack" 1325 | }, 1326 | "peerDependenciesMeta": { 1327 | "webpack-cli": { 1328 | "optional": true 1329 | } 1330 | } 1331 | }, 1332 | "node_modules/webpack-cli": { 1333 | "version": "5.0.1", 1334 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", 1335 | "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", 1336 | "dev": true, 1337 | "dependencies": { 1338 | "@discoveryjs/json-ext": "^0.5.0", 1339 | "@webpack-cli/configtest": "^2.0.1", 1340 | "@webpack-cli/info": "^2.0.1", 1341 | "@webpack-cli/serve": "^2.0.1", 1342 | "colorette": "^2.0.14", 1343 | "commander": "^9.4.1", 1344 | "cross-spawn": "^7.0.3", 1345 | "envinfo": "^7.7.3", 1346 | "fastest-levenshtein": "^1.0.12", 1347 | "import-local": "^3.0.2", 1348 | "interpret": "^3.1.1", 1349 | "rechoir": "^0.8.0", 1350 | "webpack-merge": "^5.7.3" 1351 | }, 1352 | "bin": { 1353 | "webpack-cli": "bin/cli.js" 1354 | }, 1355 | "engines": { 1356 | "node": ">=14.15.0" 1357 | }, 1358 | "funding": { 1359 | "type": "opencollective", 1360 | "url": "https://opencollective.com/webpack" 1361 | }, 1362 | "peerDependencies": { 1363 | "webpack": "5.x.x" 1364 | }, 1365 | "peerDependenciesMeta": { 1366 | "@webpack-cli/generators": { 1367 | "optional": true 1368 | }, 1369 | "webpack-bundle-analyzer": { 1370 | "optional": true 1371 | }, 1372 | "webpack-dev-server": { 1373 | "optional": true 1374 | } 1375 | } 1376 | }, 1377 | "node_modules/webpack-cli/node_modules/commander": { 1378 | "version": "9.4.1", 1379 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", 1380 | "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", 1381 | "dev": true, 1382 | "engines": { 1383 | "node": "^12.20.0 || >=14" 1384 | } 1385 | }, 1386 | "node_modules/webpack-merge": { 1387 | "version": "5.8.0", 1388 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", 1389 | "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", 1390 | "dev": true, 1391 | "dependencies": { 1392 | "clone-deep": "^4.0.1", 1393 | "wildcard": "^2.0.0" 1394 | }, 1395 | "engines": { 1396 | "node": ">=10.0.0" 1397 | } 1398 | }, 1399 | "node_modules/webpack-sources": { 1400 | "version": "3.2.3", 1401 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 1402 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 1403 | "dev": true, 1404 | "engines": { 1405 | "node": ">=10.13.0" 1406 | } 1407 | }, 1408 | "node_modules/which": { 1409 | "version": "2.0.2", 1410 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1411 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1412 | "dev": true, 1413 | "dependencies": { 1414 | "isexe": "^2.0.0" 1415 | }, 1416 | "bin": { 1417 | "node-which": "bin/node-which" 1418 | }, 1419 | "engines": { 1420 | "node": ">= 8" 1421 | } 1422 | }, 1423 | "node_modules/wildcard": { 1424 | "version": "2.0.0", 1425 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", 1426 | "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", 1427 | "dev": true 1428 | } 1429 | }, 1430 | "dependencies": { 1431 | "@discoveryjs/json-ext": { 1432 | "version": "0.5.7", 1433 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", 1434 | "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", 1435 | "dev": true 1436 | }, 1437 | "@jridgewell/gen-mapping": { 1438 | "version": "0.3.3", 1439 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 1440 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 1441 | "dev": true, 1442 | "requires": { 1443 | "@jridgewell/set-array": "^1.0.1", 1444 | "@jridgewell/sourcemap-codec": "^1.4.10", 1445 | "@jridgewell/trace-mapping": "^0.3.9" 1446 | } 1447 | }, 1448 | "@jridgewell/resolve-uri": { 1449 | "version": "3.1.0", 1450 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 1451 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 1452 | "dev": true 1453 | }, 1454 | "@jridgewell/set-array": { 1455 | "version": "1.1.2", 1456 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 1457 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 1458 | "dev": true 1459 | }, 1460 | "@jridgewell/source-map": { 1461 | "version": "0.3.3", 1462 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", 1463 | "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", 1464 | "dev": true, 1465 | "requires": { 1466 | "@jridgewell/gen-mapping": "^0.3.0", 1467 | "@jridgewell/trace-mapping": "^0.3.9" 1468 | } 1469 | }, 1470 | "@jridgewell/sourcemap-codec": { 1471 | "version": "1.4.14", 1472 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 1473 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 1474 | "dev": true 1475 | }, 1476 | "@jridgewell/trace-mapping": { 1477 | "version": "0.3.18", 1478 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 1479 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 1480 | "dev": true, 1481 | "requires": { 1482 | "@jridgewell/resolve-uri": "3.1.0", 1483 | "@jridgewell/sourcemap-codec": "1.4.14" 1484 | } 1485 | }, 1486 | "@protobufjs/aspromise": { 1487 | "version": "1.1.2", 1488 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 1489 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 1490 | }, 1491 | "@protobufjs/base64": { 1492 | "version": "1.1.2", 1493 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 1494 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 1495 | }, 1496 | "@protobufjs/codegen": { 1497 | "version": "2.0.4", 1498 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 1499 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 1500 | }, 1501 | "@protobufjs/eventemitter": { 1502 | "version": "1.1.0", 1503 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 1504 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 1505 | }, 1506 | "@protobufjs/fetch": { 1507 | "version": "1.1.0", 1508 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 1509 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 1510 | "requires": { 1511 | "@protobufjs/aspromise": "^1.1.1", 1512 | "@protobufjs/inquire": "^1.1.0" 1513 | } 1514 | }, 1515 | "@protobufjs/float": { 1516 | "version": "1.0.2", 1517 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 1518 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 1519 | }, 1520 | "@protobufjs/inquire": { 1521 | "version": "1.1.0", 1522 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 1523 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 1524 | }, 1525 | "@protobufjs/path": { 1526 | "version": "1.1.2", 1527 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 1528 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 1529 | }, 1530 | "@protobufjs/pool": { 1531 | "version": "1.1.0", 1532 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 1533 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 1534 | }, 1535 | "@protobufjs/utf8": { 1536 | "version": "1.1.0", 1537 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 1538 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 1539 | }, 1540 | "@types/eslint": { 1541 | "version": "8.4.10", 1542 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", 1543 | "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", 1544 | "dev": true, 1545 | "requires": { 1546 | "@types/estree": "*", 1547 | "@types/json-schema": "*" 1548 | } 1549 | }, 1550 | "@types/eslint-scope": { 1551 | "version": "3.7.4", 1552 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", 1553 | "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", 1554 | "dev": true, 1555 | "requires": { 1556 | "@types/eslint": "*", 1557 | "@types/estree": "*" 1558 | } 1559 | }, 1560 | "@types/estree": { 1561 | "version": "1.0.1", 1562 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", 1563 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", 1564 | "dev": true 1565 | }, 1566 | "@types/json-schema": { 1567 | "version": "7.0.11", 1568 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 1569 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 1570 | "dev": true 1571 | }, 1572 | "@types/node": { 1573 | "version": "18.11.15", 1574 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", 1575 | "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" 1576 | }, 1577 | "@webassemblyjs/ast": { 1578 | "version": "1.11.6", 1579 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", 1580 | "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", 1581 | "dev": true, 1582 | "requires": { 1583 | "@webassemblyjs/helper-numbers": "1.11.6", 1584 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6" 1585 | } 1586 | }, 1587 | "@webassemblyjs/floating-point-hex-parser": { 1588 | "version": "1.11.6", 1589 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", 1590 | "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", 1591 | "dev": true 1592 | }, 1593 | "@webassemblyjs/helper-api-error": { 1594 | "version": "1.11.6", 1595 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", 1596 | "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", 1597 | "dev": true 1598 | }, 1599 | "@webassemblyjs/helper-buffer": { 1600 | "version": "1.11.6", 1601 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", 1602 | "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", 1603 | "dev": true 1604 | }, 1605 | "@webassemblyjs/helper-numbers": { 1606 | "version": "1.11.6", 1607 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", 1608 | "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", 1609 | "dev": true, 1610 | "requires": { 1611 | "@webassemblyjs/floating-point-hex-parser": "1.11.6", 1612 | "@webassemblyjs/helper-api-error": "1.11.6", 1613 | "@xtuc/long": "4.2.2" 1614 | } 1615 | }, 1616 | "@webassemblyjs/helper-wasm-bytecode": { 1617 | "version": "1.11.6", 1618 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", 1619 | "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", 1620 | "dev": true 1621 | }, 1622 | "@webassemblyjs/helper-wasm-section": { 1623 | "version": "1.11.6", 1624 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", 1625 | "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", 1626 | "dev": true, 1627 | "requires": { 1628 | "@webassemblyjs/ast": "1.11.6", 1629 | "@webassemblyjs/helper-buffer": "1.11.6", 1630 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 1631 | "@webassemblyjs/wasm-gen": "1.11.6" 1632 | } 1633 | }, 1634 | "@webassemblyjs/ieee754": { 1635 | "version": "1.11.6", 1636 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", 1637 | "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", 1638 | "dev": true, 1639 | "requires": { 1640 | "@xtuc/ieee754": "^1.2.0" 1641 | } 1642 | }, 1643 | "@webassemblyjs/leb128": { 1644 | "version": "1.11.6", 1645 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", 1646 | "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", 1647 | "dev": true, 1648 | "requires": { 1649 | "@xtuc/long": "4.2.2" 1650 | } 1651 | }, 1652 | "@webassemblyjs/utf8": { 1653 | "version": "1.11.6", 1654 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", 1655 | "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", 1656 | "dev": true 1657 | }, 1658 | "@webassemblyjs/wasm-edit": { 1659 | "version": "1.11.6", 1660 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", 1661 | "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", 1662 | "dev": true, 1663 | "requires": { 1664 | "@webassemblyjs/ast": "1.11.6", 1665 | "@webassemblyjs/helper-buffer": "1.11.6", 1666 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 1667 | "@webassemblyjs/helper-wasm-section": "1.11.6", 1668 | "@webassemblyjs/wasm-gen": "1.11.6", 1669 | "@webassemblyjs/wasm-opt": "1.11.6", 1670 | "@webassemblyjs/wasm-parser": "1.11.6", 1671 | "@webassemblyjs/wast-printer": "1.11.6" 1672 | } 1673 | }, 1674 | "@webassemblyjs/wasm-gen": { 1675 | "version": "1.11.6", 1676 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", 1677 | "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", 1678 | "dev": true, 1679 | "requires": { 1680 | "@webassemblyjs/ast": "1.11.6", 1681 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 1682 | "@webassemblyjs/ieee754": "1.11.6", 1683 | "@webassemblyjs/leb128": "1.11.6", 1684 | "@webassemblyjs/utf8": "1.11.6" 1685 | } 1686 | }, 1687 | "@webassemblyjs/wasm-opt": { 1688 | "version": "1.11.6", 1689 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", 1690 | "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", 1691 | "dev": true, 1692 | "requires": { 1693 | "@webassemblyjs/ast": "1.11.6", 1694 | "@webassemblyjs/helper-buffer": "1.11.6", 1695 | "@webassemblyjs/wasm-gen": "1.11.6", 1696 | "@webassemblyjs/wasm-parser": "1.11.6" 1697 | } 1698 | }, 1699 | "@webassemblyjs/wasm-parser": { 1700 | "version": "1.11.6", 1701 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", 1702 | "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", 1703 | "dev": true, 1704 | "requires": { 1705 | "@webassemblyjs/ast": "1.11.6", 1706 | "@webassemblyjs/helper-api-error": "1.11.6", 1707 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 1708 | "@webassemblyjs/ieee754": "1.11.6", 1709 | "@webassemblyjs/leb128": "1.11.6", 1710 | "@webassemblyjs/utf8": "1.11.6" 1711 | } 1712 | }, 1713 | "@webassemblyjs/wast-printer": { 1714 | "version": "1.11.6", 1715 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", 1716 | "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", 1717 | "dev": true, 1718 | "requires": { 1719 | "@webassemblyjs/ast": "1.11.6", 1720 | "@xtuc/long": "4.2.2" 1721 | } 1722 | }, 1723 | "@webpack-cli/configtest": { 1724 | "version": "2.0.1", 1725 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", 1726 | "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", 1727 | "dev": true, 1728 | "requires": {} 1729 | }, 1730 | "@webpack-cli/info": { 1731 | "version": "2.0.1", 1732 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", 1733 | "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", 1734 | "dev": true, 1735 | "requires": {} 1736 | }, 1737 | "@webpack-cli/serve": { 1738 | "version": "2.0.1", 1739 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", 1740 | "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", 1741 | "dev": true, 1742 | "requires": {} 1743 | }, 1744 | "@xtuc/ieee754": { 1745 | "version": "1.2.0", 1746 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 1747 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 1748 | "dev": true 1749 | }, 1750 | "@xtuc/long": { 1751 | "version": "4.2.2", 1752 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 1753 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 1754 | "dev": true 1755 | }, 1756 | "acorn": { 1757 | "version": "8.8.1", 1758 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", 1759 | "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", 1760 | "dev": true 1761 | }, 1762 | "acorn-import-assertions": { 1763 | "version": "1.8.0", 1764 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", 1765 | "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", 1766 | "dev": true, 1767 | "requires": {} 1768 | }, 1769 | "ajv": { 1770 | "version": "6.12.6", 1771 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1772 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1773 | "dev": true, 1774 | "requires": { 1775 | "fast-deep-equal": "^3.1.1", 1776 | "fast-json-stable-stringify": "^2.0.0", 1777 | "json-schema-traverse": "^0.4.1", 1778 | "uri-js": "^4.2.2" 1779 | } 1780 | }, 1781 | "ajv-keywords": { 1782 | "version": "3.5.2", 1783 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 1784 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 1785 | "dev": true, 1786 | "requires": {} 1787 | }, 1788 | "browserslist": { 1789 | "version": "4.21.4", 1790 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 1791 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 1792 | "dev": true, 1793 | "requires": { 1794 | "caniuse-lite": "^1.0.30001400", 1795 | "electron-to-chromium": "^1.4.251", 1796 | "node-releases": "^2.0.6", 1797 | "update-browserslist-db": "^1.0.9" 1798 | } 1799 | }, 1800 | "buffer-from": { 1801 | "version": "1.1.2", 1802 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1803 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1804 | "dev": true 1805 | }, 1806 | "caniuse-lite": { 1807 | "version": "1.0.30001439", 1808 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", 1809 | "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", 1810 | "dev": true 1811 | }, 1812 | "chrome-trace-event": { 1813 | "version": "1.0.3", 1814 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", 1815 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", 1816 | "dev": true 1817 | }, 1818 | "clone-deep": { 1819 | "version": "4.0.1", 1820 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 1821 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 1822 | "dev": true, 1823 | "requires": { 1824 | "is-plain-object": "^2.0.4", 1825 | "kind-of": "^6.0.2", 1826 | "shallow-clone": "^3.0.0" 1827 | } 1828 | }, 1829 | "colorette": { 1830 | "version": "2.0.19", 1831 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", 1832 | "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", 1833 | "dev": true 1834 | }, 1835 | "commander": { 1836 | "version": "2.20.3", 1837 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1838 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1839 | "dev": true 1840 | }, 1841 | "cross-spawn": { 1842 | "version": "7.0.3", 1843 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1844 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1845 | "dev": true, 1846 | "requires": { 1847 | "path-key": "^3.1.0", 1848 | "shebang-command": "^2.0.0", 1849 | "which": "^2.0.1" 1850 | } 1851 | }, 1852 | "electron-to-chromium": { 1853 | "version": "1.4.284", 1854 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 1855 | "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 1856 | "dev": true 1857 | }, 1858 | "enhanced-resolve": { 1859 | "version": "5.14.0", 1860 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", 1861 | "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", 1862 | "dev": true, 1863 | "requires": { 1864 | "graceful-fs": "^4.2.4", 1865 | "tapable": "^2.2.0" 1866 | } 1867 | }, 1868 | "envinfo": { 1869 | "version": "7.8.1", 1870 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", 1871 | "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", 1872 | "dev": true 1873 | }, 1874 | "es-module-lexer": { 1875 | "version": "1.2.1", 1876 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", 1877 | "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", 1878 | "dev": true 1879 | }, 1880 | "escalade": { 1881 | "version": "3.1.1", 1882 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1883 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1884 | "dev": true 1885 | }, 1886 | "eslint-scope": { 1887 | "version": "5.1.1", 1888 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1889 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1890 | "dev": true, 1891 | "requires": { 1892 | "esrecurse": "^4.3.0", 1893 | "estraverse": "^4.1.1" 1894 | } 1895 | }, 1896 | "esrecurse": { 1897 | "version": "4.3.0", 1898 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1899 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1900 | "dev": true, 1901 | "requires": { 1902 | "estraverse": "^5.2.0" 1903 | }, 1904 | "dependencies": { 1905 | "estraverse": { 1906 | "version": "5.3.0", 1907 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1908 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1909 | "dev": true 1910 | } 1911 | } 1912 | }, 1913 | "estraverse": { 1914 | "version": "4.3.0", 1915 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1916 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1917 | "dev": true 1918 | }, 1919 | "events": { 1920 | "version": "3.3.0", 1921 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1922 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1923 | "dev": true 1924 | }, 1925 | "fast-deep-equal": { 1926 | "version": "3.1.3", 1927 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1928 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1929 | "dev": true 1930 | }, 1931 | "fast-json-stable-stringify": { 1932 | "version": "2.1.0", 1933 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1934 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1935 | "dev": true 1936 | }, 1937 | "fastest-levenshtein": { 1938 | "version": "1.0.16", 1939 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 1940 | "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 1941 | "dev": true 1942 | }, 1943 | "find-up": { 1944 | "version": "4.1.0", 1945 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1946 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1947 | "dev": true, 1948 | "requires": { 1949 | "locate-path": "^5.0.0", 1950 | "path-exists": "^4.0.0" 1951 | } 1952 | }, 1953 | "function-bind": { 1954 | "version": "1.1.1", 1955 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1956 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1957 | "dev": true 1958 | }, 1959 | "glob-to-regexp": { 1960 | "version": "0.4.1", 1961 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1962 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1963 | "dev": true 1964 | }, 1965 | "graceful-fs": { 1966 | "version": "4.2.10", 1967 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1968 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 1969 | "dev": true 1970 | }, 1971 | "has": { 1972 | "version": "1.0.3", 1973 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1974 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1975 | "dev": true, 1976 | "requires": { 1977 | "function-bind": "^1.1.1" 1978 | } 1979 | }, 1980 | "has-flag": { 1981 | "version": "4.0.0", 1982 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1983 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1984 | "dev": true 1985 | }, 1986 | "import-local": { 1987 | "version": "3.1.0", 1988 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 1989 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 1990 | "dev": true, 1991 | "requires": { 1992 | "pkg-dir": "^4.2.0", 1993 | "resolve-cwd": "^3.0.0" 1994 | } 1995 | }, 1996 | "interpret": { 1997 | "version": "3.1.1", 1998 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", 1999 | "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", 2000 | "dev": true 2001 | }, 2002 | "is-core-module": { 2003 | "version": "2.11.0", 2004 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2005 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2006 | "dev": true, 2007 | "requires": { 2008 | "has": "^1.0.3" 2009 | } 2010 | }, 2011 | "is-plain-object": { 2012 | "version": "2.0.4", 2013 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 2014 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 2015 | "dev": true, 2016 | "requires": { 2017 | "isobject": "^3.0.1" 2018 | } 2019 | }, 2020 | "isexe": { 2021 | "version": "2.0.0", 2022 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2023 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2024 | "dev": true 2025 | }, 2026 | "isobject": { 2027 | "version": "3.0.1", 2028 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2029 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 2030 | "dev": true 2031 | }, 2032 | "jest-worker": { 2033 | "version": "27.5.1", 2034 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 2035 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 2036 | "dev": true, 2037 | "requires": { 2038 | "@types/node": "*", 2039 | "merge-stream": "^2.0.0", 2040 | "supports-color": "^8.0.0" 2041 | } 2042 | }, 2043 | "json-parse-even-better-errors": { 2044 | "version": "2.3.1", 2045 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2046 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2047 | "dev": true 2048 | }, 2049 | "json-schema-traverse": { 2050 | "version": "0.4.1", 2051 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2052 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2053 | "dev": true 2054 | }, 2055 | "kind-of": { 2056 | "version": "6.0.3", 2057 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 2058 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 2059 | "dev": true 2060 | }, 2061 | "loader-runner": { 2062 | "version": "4.3.0", 2063 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 2064 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 2065 | "dev": true 2066 | }, 2067 | "locate-path": { 2068 | "version": "5.0.0", 2069 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2070 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2071 | "dev": true, 2072 | "requires": { 2073 | "p-locate": "^4.1.0" 2074 | } 2075 | }, 2076 | "long": { 2077 | "version": "5.2.1", 2078 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", 2079 | "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" 2080 | }, 2081 | "merge-stream": { 2082 | "version": "2.0.0", 2083 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2084 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2085 | "dev": true 2086 | }, 2087 | "mime-db": { 2088 | "version": "1.52.0", 2089 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2090 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2091 | "dev": true 2092 | }, 2093 | "mime-types": { 2094 | "version": "2.1.35", 2095 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2096 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2097 | "dev": true, 2098 | "requires": { 2099 | "mime-db": "1.52.0" 2100 | } 2101 | }, 2102 | "neo-async": { 2103 | "version": "2.6.2", 2104 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 2105 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 2106 | "dev": true 2107 | }, 2108 | "node-releases": { 2109 | "version": "2.0.7", 2110 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", 2111 | "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", 2112 | "dev": true 2113 | }, 2114 | "p-limit": { 2115 | "version": "2.3.0", 2116 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2117 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2118 | "dev": true, 2119 | "requires": { 2120 | "p-try": "^2.0.0" 2121 | } 2122 | }, 2123 | "p-locate": { 2124 | "version": "4.1.0", 2125 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2126 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2127 | "dev": true, 2128 | "requires": { 2129 | "p-limit": "^2.2.0" 2130 | } 2131 | }, 2132 | "p-try": { 2133 | "version": "2.2.0", 2134 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2135 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2136 | "dev": true 2137 | }, 2138 | "path-exists": { 2139 | "version": "4.0.0", 2140 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2141 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2142 | "dev": true 2143 | }, 2144 | "path-key": { 2145 | "version": "3.1.1", 2146 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2147 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2148 | "dev": true 2149 | }, 2150 | "path-parse": { 2151 | "version": "1.0.7", 2152 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2153 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2154 | "dev": true 2155 | }, 2156 | "picocolors": { 2157 | "version": "1.0.0", 2158 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2159 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2160 | "dev": true 2161 | }, 2162 | "pkg-dir": { 2163 | "version": "4.2.0", 2164 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2165 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2166 | "dev": true, 2167 | "requires": { 2168 | "find-up": "^4.0.0" 2169 | } 2170 | }, 2171 | "protobufjs": { 2172 | "version": "7.2.6", 2173 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", 2174 | "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", 2175 | "requires": { 2176 | "@protobufjs/aspromise": "^1.1.2", 2177 | "@protobufjs/base64": "^1.1.2", 2178 | "@protobufjs/codegen": "^2.0.4", 2179 | "@protobufjs/eventemitter": "^1.1.0", 2180 | "@protobufjs/fetch": "^1.1.0", 2181 | "@protobufjs/float": "^1.0.2", 2182 | "@protobufjs/inquire": "^1.1.0", 2183 | "@protobufjs/path": "^1.1.2", 2184 | "@protobufjs/pool": "^1.1.0", 2185 | "@protobufjs/utf8": "^1.1.0", 2186 | "@types/node": ">=13.7.0", 2187 | "long": "^5.0.0" 2188 | } 2189 | }, 2190 | "punycode": { 2191 | "version": "2.3.0", 2192 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2193 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2194 | "dev": true 2195 | }, 2196 | "randombytes": { 2197 | "version": "2.1.0", 2198 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2199 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2200 | "dev": true, 2201 | "requires": { 2202 | "safe-buffer": "^5.1.0" 2203 | } 2204 | }, 2205 | "rechoir": { 2206 | "version": "0.8.0", 2207 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 2208 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 2209 | "dev": true, 2210 | "requires": { 2211 | "resolve": "^1.20.0" 2212 | } 2213 | }, 2214 | "resolve": { 2215 | "version": "1.22.1", 2216 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2217 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2218 | "dev": true, 2219 | "requires": { 2220 | "is-core-module": "^2.9.0", 2221 | "path-parse": "^1.0.7", 2222 | "supports-preserve-symlinks-flag": "^1.0.0" 2223 | } 2224 | }, 2225 | "resolve-cwd": { 2226 | "version": "3.0.0", 2227 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 2228 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 2229 | "dev": true, 2230 | "requires": { 2231 | "resolve-from": "^5.0.0" 2232 | } 2233 | }, 2234 | "resolve-from": { 2235 | "version": "5.0.0", 2236 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2237 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2238 | "dev": true 2239 | }, 2240 | "safe-buffer": { 2241 | "version": "5.2.1", 2242 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2243 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2244 | "dev": true 2245 | }, 2246 | "schema-utils": { 2247 | "version": "3.1.2", 2248 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", 2249 | "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", 2250 | "dev": true, 2251 | "requires": { 2252 | "@types/json-schema": "^7.0.8", 2253 | "ajv": "^6.12.5", 2254 | "ajv-keywords": "^3.5.2" 2255 | } 2256 | }, 2257 | "serialize-javascript": { 2258 | "version": "6.0.1", 2259 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", 2260 | "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", 2261 | "dev": true, 2262 | "requires": { 2263 | "randombytes": "^2.1.0" 2264 | } 2265 | }, 2266 | "shallow-clone": { 2267 | "version": "3.0.1", 2268 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 2269 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 2270 | "dev": true, 2271 | "requires": { 2272 | "kind-of": "^6.0.2" 2273 | } 2274 | }, 2275 | "shebang-command": { 2276 | "version": "2.0.0", 2277 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2278 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2279 | "dev": true, 2280 | "requires": { 2281 | "shebang-regex": "^3.0.0" 2282 | } 2283 | }, 2284 | "shebang-regex": { 2285 | "version": "3.0.0", 2286 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2287 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2288 | "dev": true 2289 | }, 2290 | "source-map": { 2291 | "version": "0.6.1", 2292 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2293 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2294 | "dev": true 2295 | }, 2296 | "source-map-support": { 2297 | "version": "0.5.21", 2298 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2299 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2300 | "dev": true, 2301 | "requires": { 2302 | "buffer-from": "^1.0.0", 2303 | "source-map": "^0.6.0" 2304 | } 2305 | }, 2306 | "supports-color": { 2307 | "version": "8.1.1", 2308 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2309 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2310 | "dev": true, 2311 | "requires": { 2312 | "has-flag": "^4.0.0" 2313 | } 2314 | }, 2315 | "supports-preserve-symlinks-flag": { 2316 | "version": "1.0.0", 2317 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2318 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2319 | "dev": true 2320 | }, 2321 | "tapable": { 2322 | "version": "2.2.1", 2323 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 2324 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 2325 | "dev": true 2326 | }, 2327 | "terser": { 2328 | "version": "5.17.3", 2329 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", 2330 | "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", 2331 | "dev": true, 2332 | "requires": { 2333 | "@jridgewell/source-map": "^0.3.2", 2334 | "acorn": "^8.5.0", 2335 | "commander": "^2.20.0", 2336 | "source-map-support": "~0.5.20" 2337 | } 2338 | }, 2339 | "terser-webpack-plugin": { 2340 | "version": "5.3.8", 2341 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", 2342 | "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", 2343 | "dev": true, 2344 | "requires": { 2345 | "@jridgewell/trace-mapping": "^0.3.17", 2346 | "jest-worker": "^27.4.5", 2347 | "schema-utils": "^3.1.1", 2348 | "serialize-javascript": "^6.0.1", 2349 | "terser": "^5.16.8" 2350 | } 2351 | }, 2352 | "ua-parser-js": { 2353 | "version": "1.0.33", 2354 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", 2355 | "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==" 2356 | }, 2357 | "update-browserslist-db": { 2358 | "version": "1.0.10", 2359 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 2360 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 2361 | "dev": true, 2362 | "requires": { 2363 | "escalade": "^3.1.1", 2364 | "picocolors": "^1.0.0" 2365 | } 2366 | }, 2367 | "uri-js": { 2368 | "version": "4.4.1", 2369 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2370 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2371 | "dev": true, 2372 | "requires": { 2373 | "punycode": "^2.1.0" 2374 | } 2375 | }, 2376 | "watchpack": { 2377 | "version": "2.4.0", 2378 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", 2379 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", 2380 | "dev": true, 2381 | "requires": { 2382 | "glob-to-regexp": "^0.4.1", 2383 | "graceful-fs": "^4.1.2" 2384 | } 2385 | }, 2386 | "webpack": { 2387 | "version": "5.82.1", 2388 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", 2389 | "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", 2390 | "dev": true, 2391 | "requires": { 2392 | "@types/eslint-scope": "^3.7.3", 2393 | "@types/estree": "^1.0.0", 2394 | "@webassemblyjs/ast": "^1.11.5", 2395 | "@webassemblyjs/wasm-edit": "^1.11.5", 2396 | "@webassemblyjs/wasm-parser": "^1.11.5", 2397 | "acorn": "^8.7.1", 2398 | "acorn-import-assertions": "^1.7.6", 2399 | "browserslist": "^4.14.5", 2400 | "chrome-trace-event": "^1.0.2", 2401 | "enhanced-resolve": "^5.14.0", 2402 | "es-module-lexer": "^1.2.1", 2403 | "eslint-scope": "5.1.1", 2404 | "events": "^3.2.0", 2405 | "glob-to-regexp": "^0.4.1", 2406 | "graceful-fs": "^4.2.9", 2407 | "json-parse-even-better-errors": "^2.3.1", 2408 | "loader-runner": "^4.2.0", 2409 | "mime-types": "^2.1.27", 2410 | "neo-async": "^2.6.2", 2411 | "schema-utils": "^3.1.2", 2412 | "tapable": "^2.1.1", 2413 | "terser-webpack-plugin": "^5.3.7", 2414 | "watchpack": "^2.4.0", 2415 | "webpack-sources": "^3.2.3" 2416 | } 2417 | }, 2418 | "webpack-cli": { 2419 | "version": "5.0.1", 2420 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", 2421 | "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", 2422 | "dev": true, 2423 | "requires": { 2424 | "@discoveryjs/json-ext": "^0.5.0", 2425 | "@webpack-cli/configtest": "^2.0.1", 2426 | "@webpack-cli/info": "^2.0.1", 2427 | "@webpack-cli/serve": "^2.0.1", 2428 | "colorette": "^2.0.14", 2429 | "commander": "^9.4.1", 2430 | "cross-spawn": "^7.0.3", 2431 | "envinfo": "^7.7.3", 2432 | "fastest-levenshtein": "^1.0.12", 2433 | "import-local": "^3.0.2", 2434 | "interpret": "^3.1.1", 2435 | "rechoir": "^0.8.0", 2436 | "webpack-merge": "^5.7.3" 2437 | }, 2438 | "dependencies": { 2439 | "commander": { 2440 | "version": "9.4.1", 2441 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", 2442 | "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", 2443 | "dev": true 2444 | } 2445 | } 2446 | }, 2447 | "webpack-merge": { 2448 | "version": "5.8.0", 2449 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", 2450 | "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", 2451 | "dev": true, 2452 | "requires": { 2453 | "clone-deep": "^4.0.1", 2454 | "wildcard": "^2.0.0" 2455 | } 2456 | }, 2457 | "webpack-sources": { 2458 | "version": "3.2.3", 2459 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 2460 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 2461 | "dev": true 2462 | }, 2463 | "which": { 2464 | "version": "2.0.2", 2465 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2466 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2467 | "dev": true, 2468 | "requires": { 2469 | "isexe": "^2.0.0" 2470 | } 2471 | }, 2472 | "wildcard": { 2473 | "version": "2.0.0", 2474 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", 2475 | "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", 2476 | "dev": true 2477 | } 2478 | } 2479 | } 2480 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "touch-sdk", 3 | "version": "0.6.0", 4 | "description": "Doublepoint Touch SDK", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"No tests specified\"", 8 | "build": "webpack --mode=production --node-env=production", 9 | "build:dev": "webpack --mode=development", 10 | "build:prod": "webpack --mode=production --node-env=production", 11 | "watch": "webpack --watch", 12 | "serve": "webpack serve" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/doublepointlab/touch-sdk-js.git" 17 | }, 18 | "author": "", 19 | "license": "ISC", 20 | "bugs": { 21 | "url": "https://github.com/doublepointlab/touch-sdk-js/issues" 22 | }, 23 | "homepage": "https://github.com/doublepointlab/touch-sdk-js#readme", 24 | "devDependencies": { 25 | "webpack": "^5.75.0", 26 | "webpack-cli": "^5.0.0" 27 | }, 28 | "dependencies": { 29 | "protobufjs": "^7.1.2", 30 | "ua-parser-js": "^1.0.32" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { Update, InputUpdate, Info } from './watch_protobuf.js' 2 | import { UAParser } from 'ua-parser-js' 3 | 4 | const serviceUuids = { 5 | INTERACTION: '008e74d0-7bb3-4ac5-8baf-e5e372cced76', 6 | PROTOBUF: 'f9d60370-5325-4c64-b874-a68c7c555bad' 7 | } 8 | 9 | const characteristicUuids = { 10 | PROTOBUF_OUTPUT: 'f9d60371-5325-4c64-b874-a68c7c555bad', 11 | PROTOBUF_INPUT: 'f9d60372-5325-4c64-b874-a68c7c555bad', 12 | PROTOBUF_INFO: 'f9d60373-5325-4c64-b874-a68c7c555bad' 13 | } 14 | 15 | const handedness = [ 16 | "none", 17 | "right", 18 | "left" 19 | ] 20 | 21 | export class Watch extends EventTarget { 22 | constructor() { 23 | super() 24 | this._accepted = false 25 | 26 | this._hand = handedness[0] 27 | 28 | this._hapticsAvailable = false 29 | this._touchScreenResolution = {width: 0, height: 0} 30 | this._batteryPercentage = -1 31 | 32 | this._appId = '' 33 | this._appVersion = '' 34 | this._manufacturer = '' 35 | this._deviceName = '' 36 | this._modelInfo = '' 37 | } 38 | 39 | createConnectButton = () => { 40 | const button = document.createElement('button') 41 | button.innerText = 'Connect Touch SDK Controller' 42 | button.classList.add('touch-sdk-connect-button') 43 | 44 | button.addEventListener('click', () => { 45 | this.requestConnection() 46 | .catch(error => alert(error.message)) 47 | }) 48 | 49 | this.addEventListener('device-selected', () => { 50 | button.style.display = 'none' 51 | }) 52 | 53 | this.addEventListener('disconnected', () => { 54 | button.style.display = 'inline-block' // default display style for a button 55 | }) 56 | 57 | return button 58 | } 59 | 60 | requestConnection = async () => { 61 | if (!navigator.bluetooth) { 62 | let errorMessage 63 | if (navigator.userAgent.indexOf('Chrome') !== -1) { 64 | // Browser probably supports Web Bluetooth, but it is not enabled. 65 | errorMessage = 'Web Bluetooth is disabled. Please enable it from chrome://flags' 66 | } else { 67 | errorMessage = 'Web Bluetooth is not available, and likely not supported' + 68 | ' on your browser. Please try a Chrome-based browser.' 69 | } 70 | return Promise.reject(new Error(errorMessage)) 71 | } 72 | 73 | const filters = [{ services: [serviceUuids.INTERACTION]}] 74 | const optionalServices = [ 75 | serviceUuids.PROTOBUF 76 | ] 77 | 78 | return navigator.bluetooth.requestDevice({ filters, optionalServices }) 79 | .then(device => { 80 | this._device = device 81 | 82 | this.device.addEventListener('gattserverdisconnected', () => { 83 | const event = new CustomEvent('disconnected') 84 | this.dispatchEvent(event) 85 | }) 86 | 87 | this.device.gatt.connect() 88 | .then(gattServer => { 89 | // The watch receives a connection request, but might not accept it 90 | const event = new CustomEvent('device-selected') 91 | this.dispatchEvent(event) 92 | this._gattServer = gattServer 93 | this._sendClientInfo() 94 | this._subscribeToNotifications() 95 | }) 96 | return this 97 | }) 98 | } 99 | 100 | disconnect = () => { 101 | this.device.gatt.disconnect() 102 | } 103 | 104 | _subscribeToNotifications = () => { 105 | this.gattServer.getPrimaryService(serviceUuids.PROTOBUF).then(service => { 106 | service.getCharacteristic(characteristicUuids.PROTOBUF_OUTPUT).then(characteristic => { 107 | characteristic.addEventListener('characteristicvaluechanged', gattEvent => { 108 | const dataView = gattEvent.target.value 109 | const uints = new Uint8Array(dataView.buffer) 110 | const messageObject = Update.decode(uints) 111 | 112 | this._dispatchProtobufEvents(messageObject) 113 | 114 | }) 115 | characteristic.startNotifications() 116 | }) 117 | }) 118 | } 119 | 120 | _dispatchProtobufEvents = (message) => { 121 | for (const gesture of message.gestures) { 122 | if (gesture.type === 1) { 123 | this.dispatchEvent(new CustomEvent('tap')) 124 | } 125 | } 126 | 127 | for (const prob of message.probabilities) { 128 | let gestureProb = 0 129 | if (prob.label === 0) { 130 | gestureProb = 1 - prob.probability 131 | } else { 132 | gestureProb = prob.probability 133 | } 134 | this.dispatchEvent(new CustomEvent('probability', {detail: gestureProb})) 135 | } 136 | 137 | for (const rotaryEvent of message.rotaryEvents) { 138 | this.dispatchEvent(new CustomEvent('rotary', {detail: rotaryEvent.step})) 139 | } 140 | 141 | for (const touchEvent of message.touchEvents) { 142 | // if type is none of the known ones, eventName will be undefined 143 | const eventName = ({ 144 | 1: 'touchstart', 145 | 2: 'touchend', 146 | 3: 'touchmove', 147 | 4: 'touchcancel' 148 | })[touchEvent.type] 149 | 150 | if (eventName) 151 | this.dispatchEvent(new CustomEvent(eventName, {detail: touchEvent.coords})) 152 | } 153 | 154 | for (const buttonEvent of message.buttonEvents) { 155 | this.dispatchEvent(new CustomEvent('button', {detail: buttonEvent.id})) 156 | } 157 | 158 | for (const frame of message.sensorFrames) { 159 | this.dispatchEvent(new CustomEvent('accelerationchanged', {detail: frame.acc})) 160 | this.dispatchEvent(new CustomEvent('gravityvectorchanged', {detail: frame.grav})) 161 | this.dispatchEvent(new CustomEvent('angularvelocitychanged', {detail: frame.gyro})) 162 | this.dispatchEvent(new CustomEvent('orientationchanged', {detail: frame.quat})) 163 | this.dispatchRayCasting(frame) 164 | } 165 | 166 | if (message.info) { 167 | this._parseInfo(message.info) 168 | } 169 | 170 | if (message.signals.includes(1)) { 171 | this.gattServer.disconnect() 172 | } else if (!this._accepted) { 173 | this._fetchInfo() 174 | this._accepted = true 175 | } 176 | 177 | } 178 | 179 | _sendClientInfo = () => { 180 | this.gattServer.getPrimaryService(serviceUuids.PROTOBUF).then(service => { 181 | service.getCharacteristic(characteristicUuids.PROTOBUF_INPUT).then(characteristic => { 182 | const parser = new UAParser() 183 | parser.setUA(navigator.userAgent) 184 | const result = parser.getResult() 185 | const browser = result.browser 186 | 187 | const inputUpdate = InputUpdate.create( 188 | {clientInfo: { 189 | // file:// URLs don't have a window.location.host, use filename instead 190 | appName: window.location.host || window.location.pathname.split('/').pop(), 191 | deviceName: `${browser.name}`, 192 | os: result.os.name 193 | }} 194 | ) 195 | 196 | const data = InputUpdate.encode(inputUpdate).finish() 197 | const dataView = new DataView(data.buffer.slice(0, data.length)) 198 | 199 | characteristic.writeValueWithResponse(dataView) 200 | }) 201 | }) 202 | } 203 | 204 | _parseInfo = (info) => { 205 | 206 | const handRaw = info.hand 207 | 208 | if (handRaw >= 0 && handRaw < handedness.length) { 209 | const hand = handedness[handRaw] 210 | if (hand !== this.hand) { 211 | this._hand = hand 212 | this.dispatchEvent( 213 | new CustomEvent('handednesschanged', {detail: hand}) 214 | ) 215 | } 216 | } 217 | 218 | if (info.hapticsAvailable) { 219 | this._hapticsAvailable = true 220 | } 221 | 222 | if (info.touchScreenResolution && info.touchScreenResolution.x > 0 && info.touchScreenResolution.y > 0) { 223 | this._touchScreenResolution = {width: info.touchScreenResolution.x, height: info.touchScreenResolution.y} 224 | } 225 | 226 | if (info.batteryPercentage > 0 && info.batteryPercentage <= 100) { 227 | this._batteryPercentage = info.batteryPercentage 228 | } 229 | 230 | if (info.appId) { 231 | this._appId = info.appId 232 | } 233 | 234 | if (info.appVersion) { 235 | this._appVersion = info.appVersion 236 | } 237 | 238 | if (info.manufacturer) { 239 | this._manufacturer = info.manufacturer 240 | } 241 | 242 | if (info.deviceName) { 243 | this._deviceName = info.deviceName 244 | } 245 | 246 | if (info.modelInfo) { 247 | this._modelInfo = info.modelInfo 248 | } 249 | } 250 | 251 | _fetchInfo = () => { 252 | this.gattServer.getPrimaryService(serviceUuids.PROTOBUF).then(service => { 253 | service.getCharacteristic(characteristicUuids.PROTOBUF_OUTPUT).then(characteristic => { 254 | characteristic.readValue().then(data => { 255 | const uints = new Uint8Array(data.buffer) 256 | const info = Update.decode(uints).info 257 | this._parseInfo(info) 258 | this.dispatchEvent(new CustomEvent('connected')) 259 | }) 260 | }) 261 | }) 262 | } 263 | 264 | dispatchRayCasting = (frame) => { 265 | const scaling = 1 266 | const acceleration = 0 267 | 268 | // Assumes right hand if this.hand === 'none' 269 | const handednessScale = this.hand === 'left' ? -1 : 1 270 | 271 | const { x, y, z } = frame.grav 272 | const r = Math.sqrt(x*x + y*y + z*z) 273 | const gravityDirection = { 274 | x: x/r, 275 | y: y/r, 276 | z: z/r 277 | } 278 | const vx = -frame.gyro.z // right = + 279 | const vy = -frame.gyro.y // down = + 280 | 281 | const vr = Math.sqrt(vx*vx + vy*vy) 282 | 283 | const dx = scaling * vx * Math.pow(vr, acceleration) 284 | const dy = scaling * vy * Math.pow(vr, acceleration) 285 | 286 | const rayX = dx * gravityDirection.z + dy * gravityDirection.y 287 | const rayY = handednessScale * (dy * gravityDirection.z - dx * gravityDirection.y) 288 | 289 | this.dispatchEvent(new CustomEvent('armdirectionchanged', {detail: 290 | { 291 | dx: rayX, 292 | dy: rayY 293 | } 294 | })) 295 | 296 | // raycasting delta 297 | // ray angle speed 298 | // wrist pointing direction 299 | // raycast move 300 | } 301 | 302 | triggerHaptics = (intensity, length) => { 303 | const saneLength = Math.max(Math.min(length, 5000), 0) 304 | const saneIntensity = Math.max(Math.min(intensity, 1.0), 0.0) 305 | 306 | this.gattServer.getPrimaryService(serviceUuids.PROTOBUF).then(service => { 307 | service.getCharacteristic(characteristicUuids.PROTOBUF_INPUT).then(characteristic => { 308 | 309 | const inputUpdate = InputUpdate.create( 310 | {hapticEvent: {type: 1, intensity: saneIntensity, length: saneLength}} 311 | ) 312 | 313 | const data = InputUpdate.encode(inputUpdate).finish() 314 | const dataView = new DataView(data.buffer.slice(0, data.length)) 315 | 316 | characteristic.writeValueWithResponse(dataView) 317 | }) 318 | }) 319 | 320 | } 321 | 322 | get device() { return this._device } 323 | get gattServer() { return this._gattServer } 324 | get hand() { return this._hand } 325 | get hapticsAvailable() { return this._hapticsAvailable } 326 | get touchScreenResolution() { return this._touchScreenResolution } 327 | get batteryPercentage() { return this._batteryPercentage } 328 | get appId() { return this._appId } 329 | get appVersion() { return this._appVersion } 330 | get manufacturer() { return this._manufacturer } 331 | get deviceName() { return this._deviceName } 332 | get modelInfo() { return this._modelInfo } 333 | 334 | } 335 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = { 4 | entry: './src/index.js', 5 | output: { 6 | path: path.resolve(__dirname, 'dist'), 7 | filename: 'main.js', 8 | library: { 9 | name: 'TouchSDK', 10 | type: 'umd', 11 | }, 12 | } 13 | } 14 | --------------------------------------------------------------------------------