├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── App.ts ├── Config.ts ├── GUI.ts ├── Renderer.ts ├── global.d.ts ├── index.html ├── scenes │ ├── AbstractScene.ts │ ├── AntsComputeScene.ts │ ├── AntsDiscretizeScene.ts │ ├── DrawScene.ts │ ├── ScreenScene.ts │ ├── WorldBlurScene.ts │ └── WorldComputeScene.ts ├── shaders │ ├── ants.frag │ ├── ants.vert │ ├── antsCompute.frag │ ├── antsCompute.vert │ ├── antsDiscretize.frag │ ├── antsDiscretize.vert │ ├── draw.frag │ ├── draw.vert │ ├── screenWorld.frag │ ├── screenWorld.vert │ ├── world.frag │ ├── world.vert │ ├── worldBlur.frag │ └── worldBlur.vert ├── textures │ ├── ant.png │ └── food.png └── utils │ └── FullScreenTriangleGeometry.ts ├── tsconfig.json └── webpack.config.js /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | build -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 vHawk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ants simulation 2 | 3 | A simple ant colony GPU-accelerated simulation made with Three.js. 4 | 5 | **[Live demo](https://strandedkitty.github.io/ants-simulation/)** 6 | 7 | ![ants collecting food](https://i.imgur.com/FeU3UvR.png) 8 | 9 | ## Rules 10 | 11 | Ants can emit two types of pheromones: to-home pheromone and to-food pheromone. To-home pheromones are emitted by those ants searching for food and to-food pheromones are emitted by those carrying food. Ants searching for food are attracted to to-food pheromones, while ants searching for home are attracted to to-home pheromones. 12 | 13 | If an ant searching for food detects a food cell nearby, then it picks it up, and drops it after reaching home. 14 | 15 | If an ant senses the desirable pheromones nearby, then it turns to the direction of these pheromones, and if no pheromones are detected nearby or the ant can't decide at which direction pheromones are stronger, then is moves randomly. 16 | 17 | It is important to prevent ants from following pheromone trails left by those ants who wandered too far from home or a food source. Each individual ant has an inventory for storing pheromones. Each time an ant leaves a pheromone marker anywhere on the map a small portion of the stored pheromones is used. And each time it picks up food or reaches home its inventory gets fully refilled. 18 | 19 | Pheromone trails left by ants evaporate and diffuse over time. 20 | 21 | ## References 22 | 23 | - https://softologyblog.wordpress.com/2020/03/21/ant-colony-simulations/ 24 | - https://github.com/johnBuffer/AntSimulator 25 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ants-simulation", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discoveryjs/json-ext": { 8 | "version": "0.5.7", 9 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", 10 | "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", 11 | "dev": true 12 | }, 13 | "@jridgewell/gen-mapping": { 14 | "version": "0.3.1", 15 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", 16 | "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", 17 | "dev": true, 18 | "requires": { 19 | "@jridgewell/set-array": "^1.0.0", 20 | "@jridgewell/sourcemap-codec": "^1.4.10", 21 | "@jridgewell/trace-mapping": "^0.3.9" 22 | } 23 | }, 24 | "@jridgewell/resolve-uri": { 25 | "version": "3.0.7", 26 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", 27 | "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", 28 | "dev": true 29 | }, 30 | "@jridgewell/set-array": { 31 | "version": "1.1.1", 32 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", 33 | "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", 34 | "dev": true 35 | }, 36 | "@jridgewell/source-map": { 37 | "version": "0.3.2", 38 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", 39 | "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", 40 | "dev": true, 41 | "requires": { 42 | "@jridgewell/gen-mapping": "^0.3.0", 43 | "@jridgewell/trace-mapping": "^0.3.9" 44 | } 45 | }, 46 | "@jridgewell/sourcemap-codec": { 47 | "version": "1.4.13", 48 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", 49 | "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", 50 | "dev": true 51 | }, 52 | "@jridgewell/trace-mapping": { 53 | "version": "0.3.13", 54 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", 55 | "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", 56 | "dev": true, 57 | "requires": { 58 | "@jridgewell/resolve-uri": "^3.0.3", 59 | "@jridgewell/sourcemap-codec": "^1.4.10" 60 | } 61 | }, 62 | "@leichtgewicht/ip-codec": { 63 | "version": "2.0.4", 64 | "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", 65 | "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", 66 | "dev": true 67 | }, 68 | "@nodelib/fs.scandir": { 69 | "version": "2.1.5", 70 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 71 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 72 | "dev": true, 73 | "requires": { 74 | "@nodelib/fs.stat": "2.0.5", 75 | "run-parallel": "^1.1.9" 76 | } 77 | }, 78 | "@nodelib/fs.stat": { 79 | "version": "2.0.5", 80 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 81 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 82 | "dev": true 83 | }, 84 | "@nodelib/fs.walk": { 85 | "version": "1.2.8", 86 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 87 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 88 | "dev": true, 89 | "requires": { 90 | "@nodelib/fs.scandir": "2.1.5", 91 | "fastq": "^1.6.0" 92 | } 93 | }, 94 | "@types/body-parser": { 95 | "version": "1.19.2", 96 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 97 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 98 | "dev": true, 99 | "requires": { 100 | "@types/connect": "*", 101 | "@types/node": "*" 102 | } 103 | }, 104 | "@types/bonjour": { 105 | "version": "3.5.10", 106 | "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", 107 | "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", 108 | "dev": true, 109 | "requires": { 110 | "@types/node": "*" 111 | } 112 | }, 113 | "@types/connect": { 114 | "version": "3.4.35", 115 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 116 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 117 | "dev": true, 118 | "requires": { 119 | "@types/node": "*" 120 | } 121 | }, 122 | "@types/connect-history-api-fallback": { 123 | "version": "1.3.5", 124 | "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", 125 | "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", 126 | "dev": true, 127 | "requires": { 128 | "@types/express-serve-static-core": "*", 129 | "@types/node": "*" 130 | } 131 | }, 132 | "@types/dat.gui": { 133 | "version": "0.7.7", 134 | "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.7.tgz", 135 | "integrity": "sha512-CxLCme0He5Jk3uQwfO/fGZMyNhb/ypANzqX0yU9lviBQMlen5SOvQTBQ/Cd9x5mFlUAK5Tk8RgvTyLj1nYkz+w==", 136 | "dev": true 137 | }, 138 | "@types/eslint": { 139 | "version": "8.4.3", 140 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", 141 | "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", 142 | "dev": true, 143 | "requires": { 144 | "@types/estree": "*", 145 | "@types/json-schema": "*" 146 | } 147 | }, 148 | "@types/eslint-scope": { 149 | "version": "3.7.3", 150 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", 151 | "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", 152 | "dev": true, 153 | "requires": { 154 | "@types/eslint": "*", 155 | "@types/estree": "*" 156 | } 157 | }, 158 | "@types/estree": { 159 | "version": "0.0.51", 160 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", 161 | "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", 162 | "dev": true 163 | }, 164 | "@types/express": { 165 | "version": "4.17.13", 166 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", 167 | "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", 168 | "dev": true, 169 | "requires": { 170 | "@types/body-parser": "*", 171 | "@types/express-serve-static-core": "^4.17.18", 172 | "@types/qs": "*", 173 | "@types/serve-static": "*" 174 | } 175 | }, 176 | "@types/express-serve-static-core": { 177 | "version": "4.17.29", 178 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", 179 | "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", 180 | "dev": true, 181 | "requires": { 182 | "@types/node": "*", 183 | "@types/qs": "*", 184 | "@types/range-parser": "*" 185 | } 186 | }, 187 | "@types/glob": { 188 | "version": "7.2.0", 189 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", 190 | "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", 191 | "dev": true, 192 | "requires": { 193 | "@types/minimatch": "*", 194 | "@types/node": "*" 195 | } 196 | }, 197 | "@types/html-minifier-terser": { 198 | "version": "6.1.0", 199 | "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", 200 | "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", 201 | "dev": true 202 | }, 203 | "@types/http-proxy": { 204 | "version": "1.17.9", 205 | "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", 206 | "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", 207 | "dev": true, 208 | "requires": { 209 | "@types/node": "*" 210 | } 211 | }, 212 | "@types/json-schema": { 213 | "version": "7.0.11", 214 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 215 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 216 | "dev": true 217 | }, 218 | "@types/mime": { 219 | "version": "1.3.2", 220 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 221 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", 222 | "dev": true 223 | }, 224 | "@types/minimatch": { 225 | "version": "3.0.5", 226 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", 227 | "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", 228 | "dev": true 229 | }, 230 | "@types/node": { 231 | "version": "18.0.0", 232 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", 233 | "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==", 234 | "dev": true 235 | }, 236 | "@types/qs": { 237 | "version": "6.9.7", 238 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 239 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", 240 | "dev": true 241 | }, 242 | "@types/range-parser": { 243 | "version": "1.2.4", 244 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 245 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", 246 | "dev": true 247 | }, 248 | "@types/retry": { 249 | "version": "0.12.0", 250 | "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 251 | "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", 252 | "dev": true 253 | }, 254 | "@types/serve-index": { 255 | "version": "1.9.1", 256 | "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", 257 | "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", 258 | "dev": true, 259 | "requires": { 260 | "@types/express": "*" 261 | } 262 | }, 263 | "@types/serve-static": { 264 | "version": "1.13.10", 265 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", 266 | "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", 267 | "dev": true, 268 | "requires": { 269 | "@types/mime": "^1", 270 | "@types/node": "*" 271 | } 272 | }, 273 | "@types/sockjs": { 274 | "version": "0.3.33", 275 | "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", 276 | "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", 277 | "dev": true, 278 | "requires": { 279 | "@types/node": "*" 280 | } 281 | }, 282 | "@types/three": { 283 | "version": "0.141.0", 284 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.141.0.tgz", 285 | "integrity": "sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA==", 286 | "dev": true, 287 | "requires": { 288 | "@types/webxr": "*" 289 | } 290 | }, 291 | "@types/webxr": { 292 | "version": "0.4.0", 293 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.4.0.tgz", 294 | "integrity": "sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==", 295 | "dev": true 296 | }, 297 | "@types/ws": { 298 | "version": "8.5.3", 299 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", 300 | "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", 301 | "dev": true, 302 | "requires": { 303 | "@types/node": "*" 304 | } 305 | }, 306 | "@webassemblyjs/ast": { 307 | "version": "1.11.1", 308 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", 309 | "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", 310 | "dev": true, 311 | "requires": { 312 | "@webassemblyjs/helper-numbers": "1.11.1", 313 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1" 314 | } 315 | }, 316 | "@webassemblyjs/floating-point-hex-parser": { 317 | "version": "1.11.1", 318 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", 319 | "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", 320 | "dev": true 321 | }, 322 | "@webassemblyjs/helper-api-error": { 323 | "version": "1.11.1", 324 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", 325 | "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", 326 | "dev": true 327 | }, 328 | "@webassemblyjs/helper-buffer": { 329 | "version": "1.11.1", 330 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", 331 | "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", 332 | "dev": true 333 | }, 334 | "@webassemblyjs/helper-numbers": { 335 | "version": "1.11.1", 336 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", 337 | "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", 338 | "dev": true, 339 | "requires": { 340 | "@webassemblyjs/floating-point-hex-parser": "1.11.1", 341 | "@webassemblyjs/helper-api-error": "1.11.1", 342 | "@xtuc/long": "4.2.2" 343 | } 344 | }, 345 | "@webassemblyjs/helper-wasm-bytecode": { 346 | "version": "1.11.1", 347 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", 348 | "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", 349 | "dev": true 350 | }, 351 | "@webassemblyjs/helper-wasm-section": { 352 | "version": "1.11.1", 353 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", 354 | "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", 355 | "dev": true, 356 | "requires": { 357 | "@webassemblyjs/ast": "1.11.1", 358 | "@webassemblyjs/helper-buffer": "1.11.1", 359 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 360 | "@webassemblyjs/wasm-gen": "1.11.1" 361 | } 362 | }, 363 | "@webassemblyjs/ieee754": { 364 | "version": "1.11.1", 365 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", 366 | "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", 367 | "dev": true, 368 | "requires": { 369 | "@xtuc/ieee754": "^1.2.0" 370 | } 371 | }, 372 | "@webassemblyjs/leb128": { 373 | "version": "1.11.1", 374 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", 375 | "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", 376 | "dev": true, 377 | "requires": { 378 | "@xtuc/long": "4.2.2" 379 | } 380 | }, 381 | "@webassemblyjs/utf8": { 382 | "version": "1.11.1", 383 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", 384 | "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", 385 | "dev": true 386 | }, 387 | "@webassemblyjs/wasm-edit": { 388 | "version": "1.11.1", 389 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", 390 | "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", 391 | "dev": true, 392 | "requires": { 393 | "@webassemblyjs/ast": "1.11.1", 394 | "@webassemblyjs/helper-buffer": "1.11.1", 395 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 396 | "@webassemblyjs/helper-wasm-section": "1.11.1", 397 | "@webassemblyjs/wasm-gen": "1.11.1", 398 | "@webassemblyjs/wasm-opt": "1.11.1", 399 | "@webassemblyjs/wasm-parser": "1.11.1", 400 | "@webassemblyjs/wast-printer": "1.11.1" 401 | } 402 | }, 403 | "@webassemblyjs/wasm-gen": { 404 | "version": "1.11.1", 405 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", 406 | "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", 407 | "dev": true, 408 | "requires": { 409 | "@webassemblyjs/ast": "1.11.1", 410 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 411 | "@webassemblyjs/ieee754": "1.11.1", 412 | "@webassemblyjs/leb128": "1.11.1", 413 | "@webassemblyjs/utf8": "1.11.1" 414 | } 415 | }, 416 | "@webassemblyjs/wasm-opt": { 417 | "version": "1.11.1", 418 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", 419 | "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", 420 | "dev": true, 421 | "requires": { 422 | "@webassemblyjs/ast": "1.11.1", 423 | "@webassemblyjs/helper-buffer": "1.11.1", 424 | "@webassemblyjs/wasm-gen": "1.11.1", 425 | "@webassemblyjs/wasm-parser": "1.11.1" 426 | } 427 | }, 428 | "@webassemblyjs/wasm-parser": { 429 | "version": "1.11.1", 430 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", 431 | "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", 432 | "dev": true, 433 | "requires": { 434 | "@webassemblyjs/ast": "1.11.1", 435 | "@webassemblyjs/helper-api-error": "1.11.1", 436 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 437 | "@webassemblyjs/ieee754": "1.11.1", 438 | "@webassemblyjs/leb128": "1.11.1", 439 | "@webassemblyjs/utf8": "1.11.1" 440 | } 441 | }, 442 | "@webassemblyjs/wast-printer": { 443 | "version": "1.11.1", 444 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", 445 | "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", 446 | "dev": true, 447 | "requires": { 448 | "@webassemblyjs/ast": "1.11.1", 449 | "@xtuc/long": "4.2.2" 450 | } 451 | }, 452 | "@webpack-cli/configtest": { 453 | "version": "1.2.0", 454 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", 455 | "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", 456 | "dev": true 457 | }, 458 | "@webpack-cli/info": { 459 | "version": "1.5.0", 460 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", 461 | "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", 462 | "dev": true, 463 | "requires": { 464 | "envinfo": "^7.7.3" 465 | } 466 | }, 467 | "@webpack-cli/serve": { 468 | "version": "1.7.0", 469 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", 470 | "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", 471 | "dev": true 472 | }, 473 | "@xtuc/ieee754": { 474 | "version": "1.2.0", 475 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 476 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 477 | "dev": true 478 | }, 479 | "@xtuc/long": { 480 | "version": "4.2.2", 481 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 482 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 483 | "dev": true 484 | }, 485 | "accepts": { 486 | "version": "1.3.8", 487 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 488 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 489 | "dev": true, 490 | "requires": { 491 | "mime-types": "~2.1.34", 492 | "negotiator": "0.6.3" 493 | } 494 | }, 495 | "acorn": { 496 | "version": "8.7.1", 497 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", 498 | "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", 499 | "dev": true 500 | }, 501 | "acorn-import-assertions": { 502 | "version": "1.8.0", 503 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", 504 | "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", 505 | "dev": true 506 | }, 507 | "ajv": { 508 | "version": "6.12.6", 509 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 510 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 511 | "dev": true, 512 | "requires": { 513 | "fast-deep-equal": "^3.1.1", 514 | "fast-json-stable-stringify": "^2.0.0", 515 | "json-schema-traverse": "^0.4.1", 516 | "uri-js": "^4.2.2" 517 | } 518 | }, 519 | "ajv-formats": { 520 | "version": "2.1.1", 521 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 522 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 523 | "dev": true, 524 | "requires": { 525 | "ajv": "^8.0.0" 526 | }, 527 | "dependencies": { 528 | "ajv": { 529 | "version": "8.11.0", 530 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 531 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 532 | "dev": true, 533 | "requires": { 534 | "fast-deep-equal": "^3.1.1", 535 | "json-schema-traverse": "^1.0.0", 536 | "require-from-string": "^2.0.2", 537 | "uri-js": "^4.2.2" 538 | } 539 | }, 540 | "json-schema-traverse": { 541 | "version": "1.0.0", 542 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 543 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 544 | "dev": true 545 | } 546 | } 547 | }, 548 | "ajv-keywords": { 549 | "version": "3.5.2", 550 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 551 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 552 | "dev": true 553 | }, 554 | "ansi-html-community": { 555 | "version": "0.0.8", 556 | "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", 557 | "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", 558 | "dev": true 559 | }, 560 | "ansi-regex": { 561 | "version": "5.0.1", 562 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 563 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 564 | "dev": true 565 | }, 566 | "ansi-styles": { 567 | "version": "4.3.0", 568 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 569 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 570 | "dev": true, 571 | "requires": { 572 | "color-convert": "^2.0.1" 573 | } 574 | }, 575 | "anymatch": { 576 | "version": "3.1.2", 577 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 578 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 579 | "dev": true, 580 | "requires": { 581 | "normalize-path": "^3.0.0", 582 | "picomatch": "^2.0.4" 583 | } 584 | }, 585 | "array-flatten": { 586 | "version": "2.1.2", 587 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", 588 | "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", 589 | "dev": true 590 | }, 591 | "array-union": { 592 | "version": "1.0.2", 593 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 594 | "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", 595 | "dev": true, 596 | "requires": { 597 | "array-uniq": "^1.0.1" 598 | } 599 | }, 600 | "array-uniq": { 601 | "version": "1.0.3", 602 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 603 | "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", 604 | "dev": true 605 | }, 606 | "balanced-match": { 607 | "version": "1.0.2", 608 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 609 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 610 | "dev": true 611 | }, 612 | "batch": { 613 | "version": "0.6.1", 614 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", 615 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", 616 | "dev": true 617 | }, 618 | "big.js": { 619 | "version": "5.2.2", 620 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 621 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 622 | "dev": true 623 | }, 624 | "binary-extensions": { 625 | "version": "2.2.0", 626 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 627 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 628 | "dev": true 629 | }, 630 | "body-parser": { 631 | "version": "1.20.0", 632 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 633 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 634 | "dev": true, 635 | "requires": { 636 | "bytes": "3.1.2", 637 | "content-type": "~1.0.4", 638 | "debug": "2.6.9", 639 | "depd": "2.0.0", 640 | "destroy": "1.2.0", 641 | "http-errors": "2.0.0", 642 | "iconv-lite": "0.4.24", 643 | "on-finished": "2.4.1", 644 | "qs": "6.10.3", 645 | "raw-body": "2.5.1", 646 | "type-is": "~1.6.18", 647 | "unpipe": "1.0.0" 648 | }, 649 | "dependencies": { 650 | "bytes": { 651 | "version": "3.1.2", 652 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 653 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 654 | "dev": true 655 | } 656 | } 657 | }, 658 | "bonjour-service": { 659 | "version": "1.0.13", 660 | "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", 661 | "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", 662 | "dev": true, 663 | "requires": { 664 | "array-flatten": "^2.1.2", 665 | "dns-equal": "^1.0.0", 666 | "fast-deep-equal": "^3.1.3", 667 | "multicast-dns": "^7.2.5" 668 | } 669 | }, 670 | "boolbase": { 671 | "version": "1.0.0", 672 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 673 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 674 | "dev": true 675 | }, 676 | "brace-expansion": { 677 | "version": "1.1.11", 678 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 679 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 680 | "dev": true, 681 | "requires": { 682 | "balanced-match": "^1.0.0", 683 | "concat-map": "0.0.1" 684 | } 685 | }, 686 | "braces": { 687 | "version": "3.0.2", 688 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 689 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 690 | "dev": true, 691 | "requires": { 692 | "fill-range": "^7.0.1" 693 | } 694 | }, 695 | "browserslist": { 696 | "version": "4.21.0", 697 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", 698 | "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", 699 | "dev": true, 700 | "requires": { 701 | "caniuse-lite": "^1.0.30001358", 702 | "electron-to-chromium": "^1.4.164", 703 | "node-releases": "^2.0.5", 704 | "update-browserslist-db": "^1.0.0" 705 | } 706 | }, 707 | "buffer-from": { 708 | "version": "1.1.2", 709 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 710 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 711 | "dev": true 712 | }, 713 | "bytes": { 714 | "version": "3.0.0", 715 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 716 | "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", 717 | "dev": true 718 | }, 719 | "call-bind": { 720 | "version": "1.0.2", 721 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 722 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 723 | "dev": true, 724 | "requires": { 725 | "function-bind": "^1.1.1", 726 | "get-intrinsic": "^1.0.2" 727 | } 728 | }, 729 | "camel-case": { 730 | "version": "4.1.2", 731 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", 732 | "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", 733 | "dev": true, 734 | "requires": { 735 | "pascal-case": "^3.1.2", 736 | "tslib": "^2.0.3" 737 | } 738 | }, 739 | "caniuse-lite": { 740 | "version": "1.0.30001359", 741 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz", 742 | "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==", 743 | "dev": true 744 | }, 745 | "chalk": { 746 | "version": "4.1.2", 747 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 748 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 749 | "dev": true, 750 | "requires": { 751 | "ansi-styles": "^4.1.0", 752 | "supports-color": "^7.1.0" 753 | } 754 | }, 755 | "chokidar": { 756 | "version": "3.5.3", 757 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 758 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 759 | "dev": true, 760 | "requires": { 761 | "anymatch": "~3.1.2", 762 | "braces": "~3.0.2", 763 | "fsevents": "~2.3.2", 764 | "glob-parent": "~5.1.2", 765 | "is-binary-path": "~2.1.0", 766 | "is-glob": "~4.0.1", 767 | "normalize-path": "~3.0.0", 768 | "readdirp": "~3.6.0" 769 | } 770 | }, 771 | "chrome-trace-event": { 772 | "version": "1.0.3", 773 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", 774 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", 775 | "dev": true 776 | }, 777 | "clean-css": { 778 | "version": "5.3.0", 779 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", 780 | "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", 781 | "dev": true, 782 | "requires": { 783 | "source-map": "~0.6.0" 784 | } 785 | }, 786 | "clean-webpack-plugin": { 787 | "version": "4.0.0", 788 | "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", 789 | "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", 790 | "dev": true, 791 | "requires": { 792 | "del": "^4.1.1" 793 | } 794 | }, 795 | "clone-deep": { 796 | "version": "4.0.1", 797 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 798 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 799 | "dev": true, 800 | "requires": { 801 | "is-plain-object": "^2.0.4", 802 | "kind-of": "^6.0.2", 803 | "shallow-clone": "^3.0.0" 804 | } 805 | }, 806 | "color-convert": { 807 | "version": "2.0.1", 808 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 809 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 810 | "dev": true, 811 | "requires": { 812 | "color-name": "~1.1.4" 813 | } 814 | }, 815 | "color-name": { 816 | "version": "1.1.4", 817 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 818 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 819 | "dev": true 820 | }, 821 | "colorette": { 822 | "version": "2.0.19", 823 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", 824 | "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", 825 | "dev": true 826 | }, 827 | "commander": { 828 | "version": "2.20.3", 829 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 830 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 831 | "dev": true 832 | }, 833 | "compressible": { 834 | "version": "2.0.18", 835 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 836 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 837 | "dev": true, 838 | "requires": { 839 | "mime-db": ">= 1.43.0 < 2" 840 | } 841 | }, 842 | "compression": { 843 | "version": "1.7.4", 844 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", 845 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 846 | "dev": true, 847 | "requires": { 848 | "accepts": "~1.3.5", 849 | "bytes": "3.0.0", 850 | "compressible": "~2.0.16", 851 | "debug": "2.6.9", 852 | "on-headers": "~1.0.2", 853 | "safe-buffer": "5.1.2", 854 | "vary": "~1.1.2" 855 | }, 856 | "dependencies": { 857 | "safe-buffer": { 858 | "version": "5.1.2", 859 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 860 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 861 | "dev": true 862 | } 863 | } 864 | }, 865 | "concat-map": { 866 | "version": "0.0.1", 867 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 868 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 869 | "dev": true 870 | }, 871 | "connect-history-api-fallback": { 872 | "version": "1.6.0", 873 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", 874 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", 875 | "dev": true 876 | }, 877 | "content-disposition": { 878 | "version": "0.5.4", 879 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 880 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 881 | "dev": true, 882 | "requires": { 883 | "safe-buffer": "5.2.1" 884 | } 885 | }, 886 | "content-type": { 887 | "version": "1.0.4", 888 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 889 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 890 | "dev": true 891 | }, 892 | "cookie": { 893 | "version": "0.5.0", 894 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 895 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 896 | "dev": true 897 | }, 898 | "cookie-signature": { 899 | "version": "1.0.6", 900 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 901 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 902 | "dev": true 903 | }, 904 | "copy-webpack-plugin": { 905 | "version": "11.0.0", 906 | "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", 907 | "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", 908 | "dev": true, 909 | "requires": { 910 | "fast-glob": "^3.2.11", 911 | "glob-parent": "^6.0.1", 912 | "globby": "^13.1.1", 913 | "normalize-path": "^3.0.0", 914 | "schema-utils": "^4.0.0", 915 | "serialize-javascript": "^6.0.0" 916 | }, 917 | "dependencies": { 918 | "ajv": { 919 | "version": "8.11.0", 920 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 921 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 922 | "dev": true, 923 | "requires": { 924 | "fast-deep-equal": "^3.1.1", 925 | "json-schema-traverse": "^1.0.0", 926 | "require-from-string": "^2.0.2", 927 | "uri-js": "^4.2.2" 928 | } 929 | }, 930 | "ajv-keywords": { 931 | "version": "5.1.0", 932 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 933 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 934 | "dev": true, 935 | "requires": { 936 | "fast-deep-equal": "^3.1.3" 937 | } 938 | }, 939 | "glob-parent": { 940 | "version": "6.0.2", 941 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 942 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 943 | "dev": true, 944 | "requires": { 945 | "is-glob": "^4.0.3" 946 | } 947 | }, 948 | "globby": { 949 | "version": "13.1.2", 950 | "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", 951 | "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", 952 | "dev": true, 953 | "requires": { 954 | "dir-glob": "^3.0.1", 955 | "fast-glob": "^3.2.11", 956 | "ignore": "^5.2.0", 957 | "merge2": "^1.4.1", 958 | "slash": "^4.0.0" 959 | } 960 | }, 961 | "json-schema-traverse": { 962 | "version": "1.0.0", 963 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 964 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 965 | "dev": true 966 | }, 967 | "schema-utils": { 968 | "version": "4.0.0", 969 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", 970 | "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", 971 | "dev": true, 972 | "requires": { 973 | "@types/json-schema": "^7.0.9", 974 | "ajv": "^8.8.0", 975 | "ajv-formats": "^2.1.1", 976 | "ajv-keywords": "^5.0.0" 977 | } 978 | } 979 | } 980 | }, 981 | "core-util-is": { 982 | "version": "1.0.3", 983 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 984 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 985 | "dev": true 986 | }, 987 | "cross-spawn": { 988 | "version": "7.0.3", 989 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 990 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 991 | "dev": true, 992 | "requires": { 993 | "path-key": "^3.1.0", 994 | "shebang-command": "^2.0.0", 995 | "which": "^2.0.1" 996 | } 997 | }, 998 | "css-select": { 999 | "version": "4.3.0", 1000 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", 1001 | "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", 1002 | "dev": true, 1003 | "requires": { 1004 | "boolbase": "^1.0.0", 1005 | "css-what": "^6.0.1", 1006 | "domhandler": "^4.3.1", 1007 | "domutils": "^2.8.0", 1008 | "nth-check": "^2.0.1" 1009 | } 1010 | }, 1011 | "css-what": { 1012 | "version": "6.1.0", 1013 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 1014 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 1015 | "dev": true 1016 | }, 1017 | "dat.gui": { 1018 | "version": "0.7.9", 1019 | "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", 1020 | "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" 1021 | }, 1022 | "debug": { 1023 | "version": "2.6.9", 1024 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1025 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1026 | "dev": true, 1027 | "requires": { 1028 | "ms": "2.0.0" 1029 | } 1030 | }, 1031 | "default-gateway": { 1032 | "version": "6.0.3", 1033 | "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", 1034 | "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", 1035 | "dev": true, 1036 | "requires": { 1037 | "execa": "^5.0.0" 1038 | } 1039 | }, 1040 | "define-lazy-prop": { 1041 | "version": "2.0.0", 1042 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 1043 | "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", 1044 | "dev": true 1045 | }, 1046 | "del": { 1047 | "version": "4.1.1", 1048 | "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", 1049 | "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", 1050 | "dev": true, 1051 | "requires": { 1052 | "@types/glob": "^7.1.1", 1053 | "globby": "^6.1.0", 1054 | "is-path-cwd": "^2.0.0", 1055 | "is-path-in-cwd": "^2.0.0", 1056 | "p-map": "^2.0.0", 1057 | "pify": "^4.0.1", 1058 | "rimraf": "^2.6.3" 1059 | } 1060 | }, 1061 | "depd": { 1062 | "version": "2.0.0", 1063 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1064 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1065 | "dev": true 1066 | }, 1067 | "destroy": { 1068 | "version": "1.2.0", 1069 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1070 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 1071 | "dev": true 1072 | }, 1073 | "detect-node": { 1074 | "version": "2.1.0", 1075 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 1076 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", 1077 | "dev": true 1078 | }, 1079 | "dir-glob": { 1080 | "version": "3.0.1", 1081 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1082 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1083 | "dev": true, 1084 | "requires": { 1085 | "path-type": "^4.0.0" 1086 | } 1087 | }, 1088 | "dns-equal": { 1089 | "version": "1.0.0", 1090 | "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", 1091 | "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", 1092 | "dev": true 1093 | }, 1094 | "dns-packet": { 1095 | "version": "5.4.0", 1096 | "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", 1097 | "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", 1098 | "dev": true, 1099 | "requires": { 1100 | "@leichtgewicht/ip-codec": "^2.0.1" 1101 | } 1102 | }, 1103 | "dom-converter": { 1104 | "version": "0.2.0", 1105 | "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", 1106 | "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", 1107 | "dev": true, 1108 | "requires": { 1109 | "utila": "~0.4" 1110 | } 1111 | }, 1112 | "dom-serializer": { 1113 | "version": "1.4.1", 1114 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 1115 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 1116 | "dev": true, 1117 | "requires": { 1118 | "domelementtype": "^2.0.1", 1119 | "domhandler": "^4.2.0", 1120 | "entities": "^2.0.0" 1121 | } 1122 | }, 1123 | "domelementtype": { 1124 | "version": "2.3.0", 1125 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1126 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 1127 | "dev": true 1128 | }, 1129 | "domhandler": { 1130 | "version": "4.3.1", 1131 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 1132 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 1133 | "dev": true, 1134 | "requires": { 1135 | "domelementtype": "^2.2.0" 1136 | } 1137 | }, 1138 | "domutils": { 1139 | "version": "2.8.0", 1140 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 1141 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 1142 | "dev": true, 1143 | "requires": { 1144 | "dom-serializer": "^1.0.1", 1145 | "domelementtype": "^2.2.0", 1146 | "domhandler": "^4.2.0" 1147 | } 1148 | }, 1149 | "dot-case": { 1150 | "version": "3.0.4", 1151 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 1152 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 1153 | "dev": true, 1154 | "requires": { 1155 | "no-case": "^3.0.4", 1156 | "tslib": "^2.0.3" 1157 | } 1158 | }, 1159 | "ee-first": { 1160 | "version": "1.1.1", 1161 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1162 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 1163 | "dev": true 1164 | }, 1165 | "electron-to-chromium": { 1166 | "version": "1.4.169", 1167 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz", 1168 | "integrity": "sha512-Yb7UFva1sLlAaRyCkgoFF3qWvwZacFDtsGKi44rZsk8vnhL0DMhsUdhI4Dz9CCJQfftncDMGSI3AYiDtg8mD/w==", 1169 | "dev": true 1170 | }, 1171 | "emojis-list": { 1172 | "version": "3.0.0", 1173 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 1174 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", 1175 | "dev": true 1176 | }, 1177 | "encodeurl": { 1178 | "version": "1.0.2", 1179 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1180 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1181 | "dev": true 1182 | }, 1183 | "enhanced-resolve": { 1184 | "version": "5.9.3", 1185 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", 1186 | "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", 1187 | "dev": true, 1188 | "requires": { 1189 | "graceful-fs": "^4.2.4", 1190 | "tapable": "^2.2.0" 1191 | } 1192 | }, 1193 | "entities": { 1194 | "version": "2.2.0", 1195 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 1196 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 1197 | "dev": true 1198 | }, 1199 | "envinfo": { 1200 | "version": "7.8.1", 1201 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", 1202 | "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", 1203 | "dev": true 1204 | }, 1205 | "es-module-lexer": { 1206 | "version": "0.9.3", 1207 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", 1208 | "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", 1209 | "dev": true 1210 | }, 1211 | "escalade": { 1212 | "version": "3.1.1", 1213 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1214 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1215 | "dev": true 1216 | }, 1217 | "escape-html": { 1218 | "version": "1.0.3", 1219 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1220 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 1221 | "dev": true 1222 | }, 1223 | "eslint-scope": { 1224 | "version": "5.1.1", 1225 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1226 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1227 | "dev": true, 1228 | "requires": { 1229 | "esrecurse": "^4.3.0", 1230 | "estraverse": "^4.1.1" 1231 | } 1232 | }, 1233 | "esrecurse": { 1234 | "version": "4.3.0", 1235 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1236 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1237 | "dev": true, 1238 | "requires": { 1239 | "estraverse": "^5.2.0" 1240 | }, 1241 | "dependencies": { 1242 | "estraverse": { 1243 | "version": "5.3.0", 1244 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1245 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1246 | "dev": true 1247 | } 1248 | } 1249 | }, 1250 | "estraverse": { 1251 | "version": "4.3.0", 1252 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1253 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1254 | "dev": true 1255 | }, 1256 | "etag": { 1257 | "version": "1.8.1", 1258 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1259 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1260 | "dev": true 1261 | }, 1262 | "eventemitter3": { 1263 | "version": "4.0.7", 1264 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 1265 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 1266 | "dev": true 1267 | }, 1268 | "events": { 1269 | "version": "3.3.0", 1270 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1271 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1272 | "dev": true 1273 | }, 1274 | "execa": { 1275 | "version": "5.1.1", 1276 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1277 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1278 | "dev": true, 1279 | "requires": { 1280 | "cross-spawn": "^7.0.3", 1281 | "get-stream": "^6.0.0", 1282 | "human-signals": "^2.1.0", 1283 | "is-stream": "^2.0.0", 1284 | "merge-stream": "^2.0.0", 1285 | "npm-run-path": "^4.0.1", 1286 | "onetime": "^5.1.2", 1287 | "signal-exit": "^3.0.3", 1288 | "strip-final-newline": "^2.0.0" 1289 | } 1290 | }, 1291 | "express": { 1292 | "version": "4.18.1", 1293 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 1294 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 1295 | "dev": true, 1296 | "requires": { 1297 | "accepts": "~1.3.8", 1298 | "array-flatten": "1.1.1", 1299 | "body-parser": "1.20.0", 1300 | "content-disposition": "0.5.4", 1301 | "content-type": "~1.0.4", 1302 | "cookie": "0.5.0", 1303 | "cookie-signature": "1.0.6", 1304 | "debug": "2.6.9", 1305 | "depd": "2.0.0", 1306 | "encodeurl": "~1.0.2", 1307 | "escape-html": "~1.0.3", 1308 | "etag": "~1.8.1", 1309 | "finalhandler": "1.2.0", 1310 | "fresh": "0.5.2", 1311 | "http-errors": "2.0.0", 1312 | "merge-descriptors": "1.0.1", 1313 | "methods": "~1.1.2", 1314 | "on-finished": "2.4.1", 1315 | "parseurl": "~1.3.3", 1316 | "path-to-regexp": "0.1.7", 1317 | "proxy-addr": "~2.0.7", 1318 | "qs": "6.10.3", 1319 | "range-parser": "~1.2.1", 1320 | "safe-buffer": "5.2.1", 1321 | "send": "0.18.0", 1322 | "serve-static": "1.15.0", 1323 | "setprototypeof": "1.2.0", 1324 | "statuses": "2.0.1", 1325 | "type-is": "~1.6.18", 1326 | "utils-merge": "1.0.1", 1327 | "vary": "~1.1.2" 1328 | }, 1329 | "dependencies": { 1330 | "array-flatten": { 1331 | "version": "1.1.1", 1332 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1333 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 1334 | "dev": true 1335 | } 1336 | } 1337 | }, 1338 | "fast-deep-equal": { 1339 | "version": "3.1.3", 1340 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1341 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1342 | "dev": true 1343 | }, 1344 | "fast-glob": { 1345 | "version": "3.2.11", 1346 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 1347 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 1348 | "dev": true, 1349 | "requires": { 1350 | "@nodelib/fs.stat": "^2.0.2", 1351 | "@nodelib/fs.walk": "^1.2.3", 1352 | "glob-parent": "^5.1.2", 1353 | "merge2": "^1.3.0", 1354 | "micromatch": "^4.0.4" 1355 | } 1356 | }, 1357 | "fast-json-stable-stringify": { 1358 | "version": "2.1.0", 1359 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1360 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1361 | "dev": true 1362 | }, 1363 | "fastest-levenshtein": { 1364 | "version": "1.0.12", 1365 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", 1366 | "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", 1367 | "dev": true 1368 | }, 1369 | "fastq": { 1370 | "version": "1.13.0", 1371 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1372 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1373 | "dev": true, 1374 | "requires": { 1375 | "reusify": "^1.0.4" 1376 | } 1377 | }, 1378 | "faye-websocket": { 1379 | "version": "0.11.4", 1380 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", 1381 | "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", 1382 | "dev": true, 1383 | "requires": { 1384 | "websocket-driver": ">=0.5.1" 1385 | } 1386 | }, 1387 | "fill-range": { 1388 | "version": "7.0.1", 1389 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1390 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1391 | "dev": true, 1392 | "requires": { 1393 | "to-regex-range": "^5.0.1" 1394 | } 1395 | }, 1396 | "finalhandler": { 1397 | "version": "1.2.0", 1398 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1399 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1400 | "dev": true, 1401 | "requires": { 1402 | "debug": "2.6.9", 1403 | "encodeurl": "~1.0.2", 1404 | "escape-html": "~1.0.3", 1405 | "on-finished": "2.4.1", 1406 | "parseurl": "~1.3.3", 1407 | "statuses": "2.0.1", 1408 | "unpipe": "~1.0.0" 1409 | } 1410 | }, 1411 | "find-up": { 1412 | "version": "4.1.0", 1413 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1414 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1415 | "dev": true, 1416 | "requires": { 1417 | "locate-path": "^5.0.0", 1418 | "path-exists": "^4.0.0" 1419 | } 1420 | }, 1421 | "follow-redirects": { 1422 | "version": "1.15.1", 1423 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", 1424 | "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", 1425 | "dev": true 1426 | }, 1427 | "forwarded": { 1428 | "version": "0.2.0", 1429 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1430 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1431 | "dev": true 1432 | }, 1433 | "fresh": { 1434 | "version": "0.5.2", 1435 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1436 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1437 | "dev": true 1438 | }, 1439 | "fs-monkey": { 1440 | "version": "1.0.3", 1441 | "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", 1442 | "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", 1443 | "dev": true 1444 | }, 1445 | "fs.realpath": { 1446 | "version": "1.0.0", 1447 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1448 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1449 | "dev": true 1450 | }, 1451 | "fsevents": { 1452 | "version": "2.3.2", 1453 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1454 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1455 | "dev": true, 1456 | "optional": true 1457 | }, 1458 | "function-bind": { 1459 | "version": "1.1.1", 1460 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1461 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1462 | "dev": true 1463 | }, 1464 | "get-intrinsic": { 1465 | "version": "1.1.2", 1466 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 1467 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 1468 | "dev": true, 1469 | "requires": { 1470 | "function-bind": "^1.1.1", 1471 | "has": "^1.0.3", 1472 | "has-symbols": "^1.0.3" 1473 | } 1474 | }, 1475 | "get-stream": { 1476 | "version": "6.0.1", 1477 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1478 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1479 | "dev": true 1480 | }, 1481 | "glob": { 1482 | "version": "7.2.3", 1483 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1484 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1485 | "dev": true, 1486 | "requires": { 1487 | "fs.realpath": "^1.0.0", 1488 | "inflight": "^1.0.4", 1489 | "inherits": "2", 1490 | "minimatch": "^3.1.1", 1491 | "once": "^1.3.0", 1492 | "path-is-absolute": "^1.0.0" 1493 | } 1494 | }, 1495 | "glob-parent": { 1496 | "version": "5.1.2", 1497 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1498 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1499 | "dev": true, 1500 | "requires": { 1501 | "is-glob": "^4.0.1" 1502 | } 1503 | }, 1504 | "glob-to-regexp": { 1505 | "version": "0.4.1", 1506 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1507 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1508 | "dev": true 1509 | }, 1510 | "globby": { 1511 | "version": "6.1.0", 1512 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 1513 | "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", 1514 | "dev": true, 1515 | "requires": { 1516 | "array-union": "^1.0.1", 1517 | "glob": "^7.0.3", 1518 | "object-assign": "^4.0.1", 1519 | "pify": "^2.0.0", 1520 | "pinkie-promise": "^2.0.0" 1521 | }, 1522 | "dependencies": { 1523 | "pify": { 1524 | "version": "2.3.0", 1525 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1526 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1527 | "dev": true 1528 | } 1529 | } 1530 | }, 1531 | "graceful-fs": { 1532 | "version": "4.2.10", 1533 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1534 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 1535 | "dev": true 1536 | }, 1537 | "handle-thing": { 1538 | "version": "2.0.1", 1539 | "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", 1540 | "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", 1541 | "dev": true 1542 | }, 1543 | "has": { 1544 | "version": "1.0.3", 1545 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1546 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1547 | "dev": true, 1548 | "requires": { 1549 | "function-bind": "^1.1.1" 1550 | } 1551 | }, 1552 | "has-flag": { 1553 | "version": "4.0.0", 1554 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1555 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1556 | "dev": true 1557 | }, 1558 | "has-symbols": { 1559 | "version": "1.0.3", 1560 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1561 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1562 | "dev": true 1563 | }, 1564 | "he": { 1565 | "version": "1.2.0", 1566 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1567 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1568 | "dev": true 1569 | }, 1570 | "hpack.js": { 1571 | "version": "2.1.6", 1572 | "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", 1573 | "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", 1574 | "dev": true, 1575 | "requires": { 1576 | "inherits": "^2.0.1", 1577 | "obuf": "^1.0.0", 1578 | "readable-stream": "^2.0.1", 1579 | "wbuf": "^1.1.0" 1580 | }, 1581 | "dependencies": { 1582 | "readable-stream": { 1583 | "version": "2.3.7", 1584 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1585 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1586 | "dev": true, 1587 | "requires": { 1588 | "core-util-is": "~1.0.0", 1589 | "inherits": "~2.0.3", 1590 | "isarray": "~1.0.0", 1591 | "process-nextick-args": "~2.0.0", 1592 | "safe-buffer": "~5.1.1", 1593 | "string_decoder": "~1.1.1", 1594 | "util-deprecate": "~1.0.1" 1595 | } 1596 | }, 1597 | "safe-buffer": { 1598 | "version": "5.1.2", 1599 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1600 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1601 | "dev": true 1602 | } 1603 | } 1604 | }, 1605 | "html-entities": { 1606 | "version": "2.3.3", 1607 | "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", 1608 | "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", 1609 | "dev": true 1610 | }, 1611 | "html-minifier-terser": { 1612 | "version": "6.1.0", 1613 | "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", 1614 | "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", 1615 | "dev": true, 1616 | "requires": { 1617 | "camel-case": "^4.1.2", 1618 | "clean-css": "^5.2.2", 1619 | "commander": "^8.3.0", 1620 | "he": "^1.2.0", 1621 | "param-case": "^3.0.4", 1622 | "relateurl": "^0.2.7", 1623 | "terser": "^5.10.0" 1624 | }, 1625 | "dependencies": { 1626 | "commander": { 1627 | "version": "8.3.0", 1628 | "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", 1629 | "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", 1630 | "dev": true 1631 | } 1632 | } 1633 | }, 1634 | "html-webpack-plugin": { 1635 | "version": "5.5.0", 1636 | "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", 1637 | "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", 1638 | "dev": true, 1639 | "requires": { 1640 | "@types/html-minifier-terser": "^6.0.0", 1641 | "html-minifier-terser": "^6.0.2", 1642 | "lodash": "^4.17.21", 1643 | "pretty-error": "^4.0.0", 1644 | "tapable": "^2.0.0" 1645 | } 1646 | }, 1647 | "htmlparser2": { 1648 | "version": "6.1.0", 1649 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 1650 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 1651 | "dev": true, 1652 | "requires": { 1653 | "domelementtype": "^2.0.1", 1654 | "domhandler": "^4.0.0", 1655 | "domutils": "^2.5.2", 1656 | "entities": "^2.0.0" 1657 | } 1658 | }, 1659 | "http-deceiver": { 1660 | "version": "1.2.7", 1661 | "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", 1662 | "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", 1663 | "dev": true 1664 | }, 1665 | "http-errors": { 1666 | "version": "2.0.0", 1667 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1668 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1669 | "dev": true, 1670 | "requires": { 1671 | "depd": "2.0.0", 1672 | "inherits": "2.0.4", 1673 | "setprototypeof": "1.2.0", 1674 | "statuses": "2.0.1", 1675 | "toidentifier": "1.0.1" 1676 | } 1677 | }, 1678 | "http-parser-js": { 1679 | "version": "0.5.7", 1680 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.7.tgz", 1681 | "integrity": "sha512-8gQM8ZcewlONQLnik2AKzS13euQhaZcu4rK5QBSYOszW0T1upLW9VA2MdWvTvMmRo42HjXp7igFmdROoBCCrfg==", 1682 | "dev": true 1683 | }, 1684 | "http-proxy": { 1685 | "version": "1.18.1", 1686 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 1687 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 1688 | "dev": true, 1689 | "requires": { 1690 | "eventemitter3": "^4.0.0", 1691 | "follow-redirects": "^1.0.0", 1692 | "requires-port": "^1.0.0" 1693 | } 1694 | }, 1695 | "http-proxy-middleware": { 1696 | "version": "2.0.6", 1697 | "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", 1698 | "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", 1699 | "dev": true, 1700 | "requires": { 1701 | "@types/http-proxy": "^1.17.8", 1702 | "http-proxy": "^1.18.1", 1703 | "is-glob": "^4.0.1", 1704 | "is-plain-obj": "^3.0.0", 1705 | "micromatch": "^4.0.2" 1706 | } 1707 | }, 1708 | "human-signals": { 1709 | "version": "2.1.0", 1710 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1711 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1712 | "dev": true 1713 | }, 1714 | "iconv-lite": { 1715 | "version": "0.4.24", 1716 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1717 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1718 | "dev": true, 1719 | "requires": { 1720 | "safer-buffer": ">= 2.1.2 < 3" 1721 | } 1722 | }, 1723 | "ignore": { 1724 | "version": "5.2.0", 1725 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 1726 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 1727 | "dev": true 1728 | }, 1729 | "import-local": { 1730 | "version": "3.1.0", 1731 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 1732 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 1733 | "dev": true, 1734 | "requires": { 1735 | "pkg-dir": "^4.2.0", 1736 | "resolve-cwd": "^3.0.0" 1737 | } 1738 | }, 1739 | "inflight": { 1740 | "version": "1.0.6", 1741 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1742 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1743 | "dev": true, 1744 | "requires": { 1745 | "once": "^1.3.0", 1746 | "wrappy": "1" 1747 | } 1748 | }, 1749 | "inherits": { 1750 | "version": "2.0.4", 1751 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1752 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1753 | "dev": true 1754 | }, 1755 | "interpret": { 1756 | "version": "2.2.0", 1757 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", 1758 | "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", 1759 | "dev": true 1760 | }, 1761 | "ipaddr.js": { 1762 | "version": "2.0.1", 1763 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", 1764 | "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", 1765 | "dev": true 1766 | }, 1767 | "is-binary-path": { 1768 | "version": "2.1.0", 1769 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1770 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1771 | "dev": true, 1772 | "requires": { 1773 | "binary-extensions": "^2.0.0" 1774 | } 1775 | }, 1776 | "is-core-module": { 1777 | "version": "2.9.0", 1778 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 1779 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 1780 | "dev": true, 1781 | "requires": { 1782 | "has": "^1.0.3" 1783 | } 1784 | }, 1785 | "is-docker": { 1786 | "version": "2.2.1", 1787 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 1788 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 1789 | "dev": true 1790 | }, 1791 | "is-extglob": { 1792 | "version": "2.1.1", 1793 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1794 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1795 | "dev": true 1796 | }, 1797 | "is-glob": { 1798 | "version": "4.0.3", 1799 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1800 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1801 | "dev": true, 1802 | "requires": { 1803 | "is-extglob": "^2.1.1" 1804 | } 1805 | }, 1806 | "is-number": { 1807 | "version": "7.0.0", 1808 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1809 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1810 | "dev": true 1811 | }, 1812 | "is-path-cwd": { 1813 | "version": "2.2.0", 1814 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", 1815 | "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", 1816 | "dev": true 1817 | }, 1818 | "is-path-in-cwd": { 1819 | "version": "2.1.0", 1820 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", 1821 | "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", 1822 | "dev": true, 1823 | "requires": { 1824 | "is-path-inside": "^2.1.0" 1825 | } 1826 | }, 1827 | "is-path-inside": { 1828 | "version": "2.1.0", 1829 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", 1830 | "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", 1831 | "dev": true, 1832 | "requires": { 1833 | "path-is-inside": "^1.0.2" 1834 | } 1835 | }, 1836 | "is-plain-obj": { 1837 | "version": "3.0.0", 1838 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", 1839 | "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", 1840 | "dev": true 1841 | }, 1842 | "is-plain-object": { 1843 | "version": "2.0.4", 1844 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1845 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1846 | "dev": true, 1847 | "requires": { 1848 | "isobject": "^3.0.1" 1849 | } 1850 | }, 1851 | "is-stream": { 1852 | "version": "2.0.1", 1853 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1854 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1855 | "dev": true 1856 | }, 1857 | "is-wsl": { 1858 | "version": "2.2.0", 1859 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 1860 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 1861 | "dev": true, 1862 | "requires": { 1863 | "is-docker": "^2.0.0" 1864 | } 1865 | }, 1866 | "isarray": { 1867 | "version": "1.0.0", 1868 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1869 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1870 | "dev": true 1871 | }, 1872 | "isexe": { 1873 | "version": "2.0.0", 1874 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1875 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1876 | "dev": true 1877 | }, 1878 | "isobject": { 1879 | "version": "3.0.1", 1880 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1881 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 1882 | "dev": true 1883 | }, 1884 | "jest-worker": { 1885 | "version": "27.5.1", 1886 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 1887 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 1888 | "dev": true, 1889 | "requires": { 1890 | "@types/node": "*", 1891 | "merge-stream": "^2.0.0", 1892 | "supports-color": "^8.0.0" 1893 | }, 1894 | "dependencies": { 1895 | "supports-color": { 1896 | "version": "8.1.1", 1897 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1898 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1899 | "dev": true, 1900 | "requires": { 1901 | "has-flag": "^4.0.0" 1902 | } 1903 | } 1904 | } 1905 | }, 1906 | "json-parse-even-better-errors": { 1907 | "version": "2.3.1", 1908 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1909 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1910 | "dev": true 1911 | }, 1912 | "json-schema-traverse": { 1913 | "version": "0.4.1", 1914 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1915 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1916 | "dev": true 1917 | }, 1918 | "json5": { 1919 | "version": "2.2.1", 1920 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 1921 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 1922 | "dev": true 1923 | }, 1924 | "kind-of": { 1925 | "version": "6.0.3", 1926 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1927 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1928 | "dev": true 1929 | }, 1930 | "loader-runner": { 1931 | "version": "4.3.0", 1932 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 1933 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 1934 | "dev": true 1935 | }, 1936 | "loader-utils": { 1937 | "version": "2.0.2", 1938 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", 1939 | "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", 1940 | "dev": true, 1941 | "requires": { 1942 | "big.js": "^5.2.2", 1943 | "emojis-list": "^3.0.0", 1944 | "json5": "^2.1.2" 1945 | } 1946 | }, 1947 | "locate-path": { 1948 | "version": "5.0.0", 1949 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1950 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1951 | "dev": true, 1952 | "requires": { 1953 | "p-locate": "^4.1.0" 1954 | } 1955 | }, 1956 | "lodash": { 1957 | "version": "4.17.21", 1958 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1959 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1960 | "dev": true 1961 | }, 1962 | "lower-case": { 1963 | "version": "2.0.2", 1964 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1965 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1966 | "dev": true, 1967 | "requires": { 1968 | "tslib": "^2.0.3" 1969 | } 1970 | }, 1971 | "lru-cache": { 1972 | "version": "6.0.0", 1973 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1974 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1975 | "dev": true, 1976 | "requires": { 1977 | "yallist": "^4.0.0" 1978 | } 1979 | }, 1980 | "media-typer": { 1981 | "version": "0.3.0", 1982 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1983 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1984 | "dev": true 1985 | }, 1986 | "memfs": { 1987 | "version": "3.4.6", 1988 | "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.6.tgz", 1989 | "integrity": "sha512-rH9mjopto6Wkr7RFuH9l9dk3qb2XGOcYKr7xMhaYqfzuJqOqhRrcFvfD7JMuPj6SLmPreh5+6eAuv36NFAU+Mw==", 1990 | "dev": true, 1991 | "requires": { 1992 | "fs-monkey": "^1.0.3" 1993 | } 1994 | }, 1995 | "merge-descriptors": { 1996 | "version": "1.0.1", 1997 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1998 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", 1999 | "dev": true 2000 | }, 2001 | "merge-stream": { 2002 | "version": "2.0.0", 2003 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2004 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2005 | "dev": true 2006 | }, 2007 | "merge2": { 2008 | "version": "1.4.1", 2009 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2010 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2011 | "dev": true 2012 | }, 2013 | "methods": { 2014 | "version": "1.1.2", 2015 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2016 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 2017 | "dev": true 2018 | }, 2019 | "micromatch": { 2020 | "version": "4.0.5", 2021 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2022 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2023 | "dev": true, 2024 | "requires": { 2025 | "braces": "^3.0.2", 2026 | "picomatch": "^2.3.1" 2027 | } 2028 | }, 2029 | "mime": { 2030 | "version": "1.6.0", 2031 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2032 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2033 | "dev": true 2034 | }, 2035 | "mime-db": { 2036 | "version": "1.52.0", 2037 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2038 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2039 | "dev": true 2040 | }, 2041 | "mime-types": { 2042 | "version": "2.1.35", 2043 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2044 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2045 | "dev": true, 2046 | "requires": { 2047 | "mime-db": "1.52.0" 2048 | } 2049 | }, 2050 | "mimic-fn": { 2051 | "version": "2.1.0", 2052 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2053 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2054 | "dev": true 2055 | }, 2056 | "minimalistic-assert": { 2057 | "version": "1.0.1", 2058 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 2059 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 2060 | "dev": true 2061 | }, 2062 | "minimatch": { 2063 | "version": "3.1.2", 2064 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2065 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2066 | "dev": true, 2067 | "requires": { 2068 | "brace-expansion": "^1.1.7" 2069 | } 2070 | }, 2071 | "minimist": { 2072 | "version": "1.2.6", 2073 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2074 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 2075 | }, 2076 | "ms": { 2077 | "version": "2.0.0", 2078 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2079 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 2080 | "dev": true 2081 | }, 2082 | "multicast-dns": { 2083 | "version": "7.2.5", 2084 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", 2085 | "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", 2086 | "dev": true, 2087 | "requires": { 2088 | "dns-packet": "^5.2.2", 2089 | "thunky": "^1.0.2" 2090 | } 2091 | }, 2092 | "negotiator": { 2093 | "version": "0.6.3", 2094 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2095 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 2096 | "dev": true 2097 | }, 2098 | "neo-async": { 2099 | "version": "2.6.2", 2100 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 2101 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 2102 | "dev": true 2103 | }, 2104 | "no-case": { 2105 | "version": "3.0.4", 2106 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 2107 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 2108 | "dev": true, 2109 | "requires": { 2110 | "lower-case": "^2.0.2", 2111 | "tslib": "^2.0.3" 2112 | } 2113 | }, 2114 | "node-forge": { 2115 | "version": "1.3.1", 2116 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 2117 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", 2118 | "dev": true 2119 | }, 2120 | "node-releases": { 2121 | "version": "2.0.5", 2122 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", 2123 | "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", 2124 | "dev": true 2125 | }, 2126 | "normalize-path": { 2127 | "version": "3.0.0", 2128 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2129 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2130 | "dev": true 2131 | }, 2132 | "npm-run-path": { 2133 | "version": "4.0.1", 2134 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2135 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2136 | "dev": true, 2137 | "requires": { 2138 | "path-key": "^3.0.0" 2139 | } 2140 | }, 2141 | "nth-check": { 2142 | "version": "2.1.1", 2143 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 2144 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 2145 | "dev": true, 2146 | "requires": { 2147 | "boolbase": "^1.0.0" 2148 | } 2149 | }, 2150 | "object-assign": { 2151 | "version": "4.1.1", 2152 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2153 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2154 | "dev": true 2155 | }, 2156 | "object-inspect": { 2157 | "version": "1.12.2", 2158 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 2159 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 2160 | "dev": true 2161 | }, 2162 | "obuf": { 2163 | "version": "1.1.2", 2164 | "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", 2165 | "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", 2166 | "dev": true 2167 | }, 2168 | "on-finished": { 2169 | "version": "2.4.1", 2170 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2171 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2172 | "dev": true, 2173 | "requires": { 2174 | "ee-first": "1.1.1" 2175 | } 2176 | }, 2177 | "on-headers": { 2178 | "version": "1.0.2", 2179 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 2180 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 2181 | "dev": true 2182 | }, 2183 | "once": { 2184 | "version": "1.4.0", 2185 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2186 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2187 | "dev": true, 2188 | "requires": { 2189 | "wrappy": "1" 2190 | } 2191 | }, 2192 | "onetime": { 2193 | "version": "5.1.2", 2194 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2195 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2196 | "dev": true, 2197 | "requires": { 2198 | "mimic-fn": "^2.1.0" 2199 | } 2200 | }, 2201 | "open": { 2202 | "version": "8.4.0", 2203 | "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", 2204 | "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", 2205 | "dev": true, 2206 | "requires": { 2207 | "define-lazy-prop": "^2.0.0", 2208 | "is-docker": "^2.1.1", 2209 | "is-wsl": "^2.2.0" 2210 | } 2211 | }, 2212 | "p-limit": { 2213 | "version": "2.3.0", 2214 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2215 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2216 | "dev": true, 2217 | "requires": { 2218 | "p-try": "^2.0.0" 2219 | } 2220 | }, 2221 | "p-locate": { 2222 | "version": "4.1.0", 2223 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2224 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2225 | "dev": true, 2226 | "requires": { 2227 | "p-limit": "^2.2.0" 2228 | } 2229 | }, 2230 | "p-map": { 2231 | "version": "2.1.0", 2232 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", 2233 | "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", 2234 | "dev": true 2235 | }, 2236 | "p-retry": { 2237 | "version": "4.6.2", 2238 | "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", 2239 | "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", 2240 | "dev": true, 2241 | "requires": { 2242 | "@types/retry": "0.12.0", 2243 | "retry": "^0.13.1" 2244 | } 2245 | }, 2246 | "p-try": { 2247 | "version": "2.2.0", 2248 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2249 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2250 | "dev": true 2251 | }, 2252 | "param-case": { 2253 | "version": "3.0.4", 2254 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 2255 | "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 2256 | "dev": true, 2257 | "requires": { 2258 | "dot-case": "^3.0.4", 2259 | "tslib": "^2.0.3" 2260 | } 2261 | }, 2262 | "parseurl": { 2263 | "version": "1.3.3", 2264 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2265 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 2266 | "dev": true 2267 | }, 2268 | "pascal-case": { 2269 | "version": "3.1.2", 2270 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 2271 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 2272 | "dev": true, 2273 | "requires": { 2274 | "no-case": "^3.0.4", 2275 | "tslib": "^2.0.3" 2276 | } 2277 | }, 2278 | "path-exists": { 2279 | "version": "4.0.0", 2280 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2281 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2282 | "dev": true 2283 | }, 2284 | "path-is-absolute": { 2285 | "version": "1.0.1", 2286 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2287 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2288 | "dev": true 2289 | }, 2290 | "path-is-inside": { 2291 | "version": "1.0.2", 2292 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2293 | "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", 2294 | "dev": true 2295 | }, 2296 | "path-key": { 2297 | "version": "3.1.1", 2298 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2299 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2300 | "dev": true 2301 | }, 2302 | "path-parse": { 2303 | "version": "1.0.7", 2304 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2305 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2306 | "dev": true 2307 | }, 2308 | "path-to-regexp": { 2309 | "version": "0.1.7", 2310 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2311 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", 2312 | "dev": true 2313 | }, 2314 | "path-type": { 2315 | "version": "4.0.0", 2316 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2317 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2318 | "dev": true 2319 | }, 2320 | "picocolors": { 2321 | "version": "1.0.0", 2322 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2323 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2324 | "dev": true 2325 | }, 2326 | "picomatch": { 2327 | "version": "2.3.1", 2328 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2329 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2330 | "dev": true 2331 | }, 2332 | "pify": { 2333 | "version": "4.0.1", 2334 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 2335 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 2336 | "dev": true 2337 | }, 2338 | "pinkie": { 2339 | "version": "2.0.4", 2340 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2341 | "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", 2342 | "dev": true 2343 | }, 2344 | "pinkie-promise": { 2345 | "version": "2.0.1", 2346 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2347 | "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", 2348 | "dev": true, 2349 | "requires": { 2350 | "pinkie": "^2.0.0" 2351 | } 2352 | }, 2353 | "pkg-dir": { 2354 | "version": "4.2.0", 2355 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2356 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2357 | "dev": true, 2358 | "requires": { 2359 | "find-up": "^4.0.0" 2360 | } 2361 | }, 2362 | "pretty-error": { 2363 | "version": "4.0.0", 2364 | "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", 2365 | "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", 2366 | "dev": true, 2367 | "requires": { 2368 | "lodash": "^4.17.20", 2369 | "renderkid": "^3.0.0" 2370 | } 2371 | }, 2372 | "process-nextick-args": { 2373 | "version": "2.0.1", 2374 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2375 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2376 | "dev": true 2377 | }, 2378 | "proxy-addr": { 2379 | "version": "2.0.7", 2380 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2381 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2382 | "dev": true, 2383 | "requires": { 2384 | "forwarded": "0.2.0", 2385 | "ipaddr.js": "1.9.1" 2386 | }, 2387 | "dependencies": { 2388 | "ipaddr.js": { 2389 | "version": "1.9.1", 2390 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2391 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 2392 | "dev": true 2393 | } 2394 | } 2395 | }, 2396 | "punycode": { 2397 | "version": "2.1.1", 2398 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2399 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2400 | "dev": true 2401 | }, 2402 | "push-dir": { 2403 | "version": "0.4.1", 2404 | "resolved": "https://registry.npmjs.org/push-dir/-/push-dir-0.4.1.tgz", 2405 | "integrity": "sha512-Nrrsly0c3kCfu725Jnif/s5adHpBwKCGWBttHVxTndF4iyGBSFtNi/pduFxHF5ks0kWtHcbA3XXP5MEra6iiCA==", 2406 | "requires": { 2407 | "minimist": "^1.2.0" 2408 | } 2409 | }, 2410 | "qs": { 2411 | "version": "6.10.3", 2412 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 2413 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 2414 | "dev": true, 2415 | "requires": { 2416 | "side-channel": "^1.0.4" 2417 | } 2418 | }, 2419 | "queue-microtask": { 2420 | "version": "1.2.3", 2421 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2422 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2423 | "dev": true 2424 | }, 2425 | "randombytes": { 2426 | "version": "2.1.0", 2427 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2428 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2429 | "dev": true, 2430 | "requires": { 2431 | "safe-buffer": "^5.1.0" 2432 | } 2433 | }, 2434 | "range-parser": { 2435 | "version": "1.2.1", 2436 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2437 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2438 | "dev": true 2439 | }, 2440 | "raw-body": { 2441 | "version": "2.5.1", 2442 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 2443 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 2444 | "dev": true, 2445 | "requires": { 2446 | "bytes": "3.1.2", 2447 | "http-errors": "2.0.0", 2448 | "iconv-lite": "0.4.24", 2449 | "unpipe": "1.0.0" 2450 | }, 2451 | "dependencies": { 2452 | "bytes": { 2453 | "version": "3.1.2", 2454 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 2455 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 2456 | "dev": true 2457 | } 2458 | } 2459 | }, 2460 | "raw-loader": { 2461 | "version": "4.0.2", 2462 | "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", 2463 | "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", 2464 | "dev": true, 2465 | "requires": { 2466 | "loader-utils": "^2.0.0", 2467 | "schema-utils": "^3.0.0" 2468 | } 2469 | }, 2470 | "readable-stream": { 2471 | "version": "3.6.0", 2472 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2473 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2474 | "dev": true, 2475 | "requires": { 2476 | "inherits": "^2.0.3", 2477 | "string_decoder": "^1.1.1", 2478 | "util-deprecate": "^1.0.1" 2479 | } 2480 | }, 2481 | "readdirp": { 2482 | "version": "3.6.0", 2483 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2484 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2485 | "dev": true, 2486 | "requires": { 2487 | "picomatch": "^2.2.1" 2488 | } 2489 | }, 2490 | "rechoir": { 2491 | "version": "0.7.1", 2492 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", 2493 | "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", 2494 | "dev": true, 2495 | "requires": { 2496 | "resolve": "^1.9.0" 2497 | } 2498 | }, 2499 | "relateurl": { 2500 | "version": "0.2.7", 2501 | "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", 2502 | "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", 2503 | "dev": true 2504 | }, 2505 | "renderkid": { 2506 | "version": "3.0.0", 2507 | "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", 2508 | "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", 2509 | "dev": true, 2510 | "requires": { 2511 | "css-select": "^4.1.3", 2512 | "dom-converter": "^0.2.0", 2513 | "htmlparser2": "^6.1.0", 2514 | "lodash": "^4.17.21", 2515 | "strip-ansi": "^6.0.1" 2516 | } 2517 | }, 2518 | "require-from-string": { 2519 | "version": "2.0.2", 2520 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2521 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2522 | "dev": true 2523 | }, 2524 | "requires-port": { 2525 | "version": "1.0.0", 2526 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 2527 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 2528 | "dev": true 2529 | }, 2530 | "resolve": { 2531 | "version": "1.22.1", 2532 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2533 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2534 | "dev": true, 2535 | "requires": { 2536 | "is-core-module": "^2.9.0", 2537 | "path-parse": "^1.0.7", 2538 | "supports-preserve-symlinks-flag": "^1.0.0" 2539 | } 2540 | }, 2541 | "resolve-cwd": { 2542 | "version": "3.0.0", 2543 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 2544 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 2545 | "dev": true, 2546 | "requires": { 2547 | "resolve-from": "^5.0.0" 2548 | } 2549 | }, 2550 | "resolve-from": { 2551 | "version": "5.0.0", 2552 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2553 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2554 | "dev": true 2555 | }, 2556 | "retry": { 2557 | "version": "0.13.1", 2558 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 2559 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 2560 | "dev": true 2561 | }, 2562 | "reusify": { 2563 | "version": "1.0.4", 2564 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2565 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2566 | "dev": true 2567 | }, 2568 | "rimraf": { 2569 | "version": "2.7.1", 2570 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 2571 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2572 | "dev": true, 2573 | "requires": { 2574 | "glob": "^7.1.3" 2575 | } 2576 | }, 2577 | "run-parallel": { 2578 | "version": "1.2.0", 2579 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2580 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2581 | "dev": true, 2582 | "requires": { 2583 | "queue-microtask": "^1.2.2" 2584 | } 2585 | }, 2586 | "safe-buffer": { 2587 | "version": "5.2.1", 2588 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2589 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2590 | "dev": true 2591 | }, 2592 | "safer-buffer": { 2593 | "version": "2.1.2", 2594 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2595 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2596 | "dev": true 2597 | }, 2598 | "schema-utils": { 2599 | "version": "3.1.1", 2600 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", 2601 | "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", 2602 | "dev": true, 2603 | "requires": { 2604 | "@types/json-schema": "^7.0.8", 2605 | "ajv": "^6.12.5", 2606 | "ajv-keywords": "^3.5.2" 2607 | } 2608 | }, 2609 | "select-hose": { 2610 | "version": "2.0.0", 2611 | "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", 2612 | "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", 2613 | "dev": true 2614 | }, 2615 | "selfsigned": { 2616 | "version": "2.0.1", 2617 | "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", 2618 | "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", 2619 | "dev": true, 2620 | "requires": { 2621 | "node-forge": "^1" 2622 | } 2623 | }, 2624 | "semver": { 2625 | "version": "7.3.7", 2626 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 2627 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 2628 | "dev": true, 2629 | "requires": { 2630 | "lru-cache": "^6.0.0" 2631 | } 2632 | }, 2633 | "send": { 2634 | "version": "0.18.0", 2635 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2636 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2637 | "dev": true, 2638 | "requires": { 2639 | "debug": "2.6.9", 2640 | "depd": "2.0.0", 2641 | "destroy": "1.2.0", 2642 | "encodeurl": "~1.0.2", 2643 | "escape-html": "~1.0.3", 2644 | "etag": "~1.8.1", 2645 | "fresh": "0.5.2", 2646 | "http-errors": "2.0.0", 2647 | "mime": "1.6.0", 2648 | "ms": "2.1.3", 2649 | "on-finished": "2.4.1", 2650 | "range-parser": "~1.2.1", 2651 | "statuses": "2.0.1" 2652 | }, 2653 | "dependencies": { 2654 | "ms": { 2655 | "version": "2.1.3", 2656 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2657 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2658 | "dev": true 2659 | } 2660 | } 2661 | }, 2662 | "serialize-javascript": { 2663 | "version": "6.0.0", 2664 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2665 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2666 | "dev": true, 2667 | "requires": { 2668 | "randombytes": "^2.1.0" 2669 | } 2670 | }, 2671 | "serve-index": { 2672 | "version": "1.9.1", 2673 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", 2674 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", 2675 | "dev": true, 2676 | "requires": { 2677 | "accepts": "~1.3.4", 2678 | "batch": "0.6.1", 2679 | "debug": "2.6.9", 2680 | "escape-html": "~1.0.3", 2681 | "http-errors": "~1.6.2", 2682 | "mime-types": "~2.1.17", 2683 | "parseurl": "~1.3.2" 2684 | }, 2685 | "dependencies": { 2686 | "depd": { 2687 | "version": "1.1.2", 2688 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 2689 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 2690 | "dev": true 2691 | }, 2692 | "http-errors": { 2693 | "version": "1.6.3", 2694 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 2695 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 2696 | "dev": true, 2697 | "requires": { 2698 | "depd": "~1.1.2", 2699 | "inherits": "2.0.3", 2700 | "setprototypeof": "1.1.0", 2701 | "statuses": ">= 1.4.0 < 2" 2702 | } 2703 | }, 2704 | "inherits": { 2705 | "version": "2.0.3", 2706 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2707 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 2708 | "dev": true 2709 | }, 2710 | "setprototypeof": { 2711 | "version": "1.1.0", 2712 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2713 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 2714 | "dev": true 2715 | }, 2716 | "statuses": { 2717 | "version": "1.5.0", 2718 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2719 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 2720 | "dev": true 2721 | } 2722 | } 2723 | }, 2724 | "serve-static": { 2725 | "version": "1.15.0", 2726 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 2727 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2728 | "dev": true, 2729 | "requires": { 2730 | "encodeurl": "~1.0.2", 2731 | "escape-html": "~1.0.3", 2732 | "parseurl": "~1.3.3", 2733 | "send": "0.18.0" 2734 | } 2735 | }, 2736 | "setprototypeof": { 2737 | "version": "1.2.0", 2738 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2739 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 2740 | "dev": true 2741 | }, 2742 | "shallow-clone": { 2743 | "version": "3.0.1", 2744 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 2745 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 2746 | "dev": true, 2747 | "requires": { 2748 | "kind-of": "^6.0.2" 2749 | } 2750 | }, 2751 | "shebang-command": { 2752 | "version": "2.0.0", 2753 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2754 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2755 | "dev": true, 2756 | "requires": { 2757 | "shebang-regex": "^3.0.0" 2758 | } 2759 | }, 2760 | "shebang-regex": { 2761 | "version": "3.0.0", 2762 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2763 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2764 | "dev": true 2765 | }, 2766 | "side-channel": { 2767 | "version": "1.0.4", 2768 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2769 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2770 | "dev": true, 2771 | "requires": { 2772 | "call-bind": "^1.0.0", 2773 | "get-intrinsic": "^1.0.2", 2774 | "object-inspect": "^1.9.0" 2775 | } 2776 | }, 2777 | "signal-exit": { 2778 | "version": "3.0.7", 2779 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2780 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2781 | "dev": true 2782 | }, 2783 | "slash": { 2784 | "version": "4.0.0", 2785 | "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", 2786 | "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", 2787 | "dev": true 2788 | }, 2789 | "sockjs": { 2790 | "version": "0.3.24", 2791 | "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", 2792 | "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", 2793 | "dev": true, 2794 | "requires": { 2795 | "faye-websocket": "^0.11.3", 2796 | "uuid": "^8.3.2", 2797 | "websocket-driver": "^0.7.4" 2798 | } 2799 | }, 2800 | "source-map": { 2801 | "version": "0.6.1", 2802 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2803 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2804 | "dev": true 2805 | }, 2806 | "source-map-support": { 2807 | "version": "0.5.21", 2808 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2809 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2810 | "dev": true, 2811 | "requires": { 2812 | "buffer-from": "^1.0.0", 2813 | "source-map": "^0.6.0" 2814 | } 2815 | }, 2816 | "spdy": { 2817 | "version": "4.0.2", 2818 | "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", 2819 | "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", 2820 | "dev": true, 2821 | "requires": { 2822 | "debug": "^4.1.0", 2823 | "handle-thing": "^2.0.0", 2824 | "http-deceiver": "^1.2.7", 2825 | "select-hose": "^2.0.0", 2826 | "spdy-transport": "^3.0.0" 2827 | }, 2828 | "dependencies": { 2829 | "debug": { 2830 | "version": "4.3.4", 2831 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2832 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2833 | "dev": true, 2834 | "requires": { 2835 | "ms": "2.1.2" 2836 | } 2837 | }, 2838 | "ms": { 2839 | "version": "2.1.2", 2840 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2841 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2842 | "dev": true 2843 | } 2844 | } 2845 | }, 2846 | "spdy-transport": { 2847 | "version": "3.0.0", 2848 | "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", 2849 | "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", 2850 | "dev": true, 2851 | "requires": { 2852 | "debug": "^4.1.0", 2853 | "detect-node": "^2.0.4", 2854 | "hpack.js": "^2.1.6", 2855 | "obuf": "^1.1.2", 2856 | "readable-stream": "^3.0.6", 2857 | "wbuf": "^1.7.3" 2858 | }, 2859 | "dependencies": { 2860 | "debug": { 2861 | "version": "4.3.4", 2862 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2863 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2864 | "dev": true, 2865 | "requires": { 2866 | "ms": "2.1.2" 2867 | } 2868 | }, 2869 | "ms": { 2870 | "version": "2.1.2", 2871 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2872 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2873 | "dev": true 2874 | } 2875 | } 2876 | }, 2877 | "statuses": { 2878 | "version": "2.0.1", 2879 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2880 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2881 | "dev": true 2882 | }, 2883 | "string_decoder": { 2884 | "version": "1.1.1", 2885 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2886 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2887 | "dev": true, 2888 | "requires": { 2889 | "safe-buffer": "~5.1.0" 2890 | }, 2891 | "dependencies": { 2892 | "safe-buffer": { 2893 | "version": "5.1.2", 2894 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2895 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2896 | "dev": true 2897 | } 2898 | } 2899 | }, 2900 | "strip-ansi": { 2901 | "version": "6.0.1", 2902 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2903 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2904 | "dev": true, 2905 | "requires": { 2906 | "ansi-regex": "^5.0.1" 2907 | } 2908 | }, 2909 | "strip-final-newline": { 2910 | "version": "2.0.0", 2911 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2912 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2913 | "dev": true 2914 | }, 2915 | "supports-color": { 2916 | "version": "7.2.0", 2917 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2918 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2919 | "dev": true, 2920 | "requires": { 2921 | "has-flag": "^4.0.0" 2922 | } 2923 | }, 2924 | "supports-preserve-symlinks-flag": { 2925 | "version": "1.0.0", 2926 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2927 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2928 | "dev": true 2929 | }, 2930 | "tapable": { 2931 | "version": "2.2.1", 2932 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 2933 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 2934 | "dev": true 2935 | }, 2936 | "terser": { 2937 | "version": "5.14.1", 2938 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", 2939 | "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", 2940 | "dev": true, 2941 | "requires": { 2942 | "@jridgewell/source-map": "^0.3.2", 2943 | "acorn": "^8.5.0", 2944 | "commander": "^2.20.0", 2945 | "source-map-support": "~0.5.20" 2946 | } 2947 | }, 2948 | "terser-webpack-plugin": { 2949 | "version": "5.3.3", 2950 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", 2951 | "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", 2952 | "dev": true, 2953 | "requires": { 2954 | "@jridgewell/trace-mapping": "^0.3.7", 2955 | "jest-worker": "^27.4.5", 2956 | "schema-utils": "^3.1.1", 2957 | "serialize-javascript": "^6.0.0", 2958 | "terser": "^5.7.2" 2959 | } 2960 | }, 2961 | "three": { 2962 | "version": "0.141.0", 2963 | "resolved": "https://registry.npmjs.org/three/-/three-0.141.0.tgz", 2964 | "integrity": "sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA==" 2965 | }, 2966 | "thunky": { 2967 | "version": "1.1.0", 2968 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", 2969 | "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", 2970 | "dev": true 2971 | }, 2972 | "to-regex-range": { 2973 | "version": "5.0.1", 2974 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2975 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2976 | "dev": true, 2977 | "requires": { 2978 | "is-number": "^7.0.0" 2979 | } 2980 | }, 2981 | "toidentifier": { 2982 | "version": "1.0.1", 2983 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2984 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2985 | "dev": true 2986 | }, 2987 | "ts-loader": { 2988 | "version": "9.3.1", 2989 | "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", 2990 | "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", 2991 | "dev": true, 2992 | "requires": { 2993 | "chalk": "^4.1.0", 2994 | "enhanced-resolve": "^5.0.0", 2995 | "micromatch": "^4.0.0", 2996 | "semver": "^7.3.4" 2997 | } 2998 | }, 2999 | "tslib": { 3000 | "version": "2.4.0", 3001 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 3002 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 3003 | "dev": true 3004 | }, 3005 | "type-is": { 3006 | "version": "1.6.18", 3007 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3008 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3009 | "dev": true, 3010 | "requires": { 3011 | "media-typer": "0.3.0", 3012 | "mime-types": "~2.1.24" 3013 | } 3014 | }, 3015 | "typescript": { 3016 | "version": "4.7.4", 3017 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 3018 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 3019 | "dev": true 3020 | }, 3021 | "unpipe": { 3022 | "version": "1.0.0", 3023 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3024 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 3025 | "dev": true 3026 | }, 3027 | "update-browserslist-db": { 3028 | "version": "1.0.4", 3029 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", 3030 | "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", 3031 | "dev": true, 3032 | "requires": { 3033 | "escalade": "^3.1.1", 3034 | "picocolors": "^1.0.0" 3035 | } 3036 | }, 3037 | "uri-js": { 3038 | "version": "4.4.1", 3039 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3040 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3041 | "dev": true, 3042 | "requires": { 3043 | "punycode": "^2.1.0" 3044 | } 3045 | }, 3046 | "util-deprecate": { 3047 | "version": "1.0.2", 3048 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3049 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3050 | "dev": true 3051 | }, 3052 | "utila": { 3053 | "version": "0.4.0", 3054 | "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", 3055 | "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", 3056 | "dev": true 3057 | }, 3058 | "utils-merge": { 3059 | "version": "1.0.1", 3060 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3061 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 3062 | "dev": true 3063 | }, 3064 | "uuid": { 3065 | "version": "8.3.2", 3066 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 3067 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 3068 | "dev": true 3069 | }, 3070 | "vary": { 3071 | "version": "1.1.2", 3072 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3073 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 3074 | "dev": true 3075 | }, 3076 | "watchpack": { 3077 | "version": "2.4.0", 3078 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", 3079 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", 3080 | "dev": true, 3081 | "requires": { 3082 | "glob-to-regexp": "^0.4.1", 3083 | "graceful-fs": "^4.1.2" 3084 | } 3085 | }, 3086 | "wbuf": { 3087 | "version": "1.7.3", 3088 | "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", 3089 | "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", 3090 | "dev": true, 3091 | "requires": { 3092 | "minimalistic-assert": "^1.0.0" 3093 | } 3094 | }, 3095 | "webpack": { 3096 | "version": "5.73.0", 3097 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", 3098 | "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", 3099 | "dev": true, 3100 | "requires": { 3101 | "@types/eslint-scope": "^3.7.3", 3102 | "@types/estree": "^0.0.51", 3103 | "@webassemblyjs/ast": "1.11.1", 3104 | "@webassemblyjs/wasm-edit": "1.11.1", 3105 | "@webassemblyjs/wasm-parser": "1.11.1", 3106 | "acorn": "^8.4.1", 3107 | "acorn-import-assertions": "^1.7.6", 3108 | "browserslist": "^4.14.5", 3109 | "chrome-trace-event": "^1.0.2", 3110 | "enhanced-resolve": "^5.9.3", 3111 | "es-module-lexer": "^0.9.0", 3112 | "eslint-scope": "5.1.1", 3113 | "events": "^3.2.0", 3114 | "glob-to-regexp": "^0.4.1", 3115 | "graceful-fs": "^4.2.9", 3116 | "json-parse-even-better-errors": "^2.3.1", 3117 | "loader-runner": "^4.2.0", 3118 | "mime-types": "^2.1.27", 3119 | "neo-async": "^2.6.2", 3120 | "schema-utils": "^3.1.0", 3121 | "tapable": "^2.1.1", 3122 | "terser-webpack-plugin": "^5.1.3", 3123 | "watchpack": "^2.3.1", 3124 | "webpack-sources": "^3.2.3" 3125 | } 3126 | }, 3127 | "webpack-cli": { 3128 | "version": "4.10.0", 3129 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", 3130 | "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", 3131 | "dev": true, 3132 | "requires": { 3133 | "@discoveryjs/json-ext": "^0.5.0", 3134 | "@webpack-cli/configtest": "^1.2.0", 3135 | "@webpack-cli/info": "^1.5.0", 3136 | "@webpack-cli/serve": "^1.7.0", 3137 | "colorette": "^2.0.14", 3138 | "commander": "^7.0.0", 3139 | "cross-spawn": "^7.0.3", 3140 | "fastest-levenshtein": "^1.0.12", 3141 | "import-local": "^3.0.2", 3142 | "interpret": "^2.2.0", 3143 | "rechoir": "^0.7.0", 3144 | "webpack-merge": "^5.7.3" 3145 | }, 3146 | "dependencies": { 3147 | "commander": { 3148 | "version": "7.2.0", 3149 | "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", 3150 | "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", 3151 | "dev": true 3152 | } 3153 | } 3154 | }, 3155 | "webpack-dev-middleware": { 3156 | "version": "5.3.3", 3157 | "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", 3158 | "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", 3159 | "dev": true, 3160 | "requires": { 3161 | "colorette": "^2.0.10", 3162 | "memfs": "^3.4.3", 3163 | "mime-types": "^2.1.31", 3164 | "range-parser": "^1.2.1", 3165 | "schema-utils": "^4.0.0" 3166 | }, 3167 | "dependencies": { 3168 | "ajv": { 3169 | "version": "8.11.0", 3170 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 3171 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 3172 | "dev": true, 3173 | "requires": { 3174 | "fast-deep-equal": "^3.1.1", 3175 | "json-schema-traverse": "^1.0.0", 3176 | "require-from-string": "^2.0.2", 3177 | "uri-js": "^4.2.2" 3178 | } 3179 | }, 3180 | "ajv-keywords": { 3181 | "version": "5.1.0", 3182 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 3183 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 3184 | "dev": true, 3185 | "requires": { 3186 | "fast-deep-equal": "^3.1.3" 3187 | } 3188 | }, 3189 | "json-schema-traverse": { 3190 | "version": "1.0.0", 3191 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 3192 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 3193 | "dev": true 3194 | }, 3195 | "schema-utils": { 3196 | "version": "4.0.0", 3197 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", 3198 | "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", 3199 | "dev": true, 3200 | "requires": { 3201 | "@types/json-schema": "^7.0.9", 3202 | "ajv": "^8.8.0", 3203 | "ajv-formats": "^2.1.1", 3204 | "ajv-keywords": "^5.0.0" 3205 | } 3206 | } 3207 | } 3208 | }, 3209 | "webpack-dev-server": { 3210 | "version": "4.9.2", 3211 | "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", 3212 | "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", 3213 | "dev": true, 3214 | "requires": { 3215 | "@types/bonjour": "^3.5.9", 3216 | "@types/connect-history-api-fallback": "^1.3.5", 3217 | "@types/express": "^4.17.13", 3218 | "@types/serve-index": "^1.9.1", 3219 | "@types/serve-static": "^1.13.10", 3220 | "@types/sockjs": "^0.3.33", 3221 | "@types/ws": "^8.5.1", 3222 | "ansi-html-community": "^0.0.8", 3223 | "bonjour-service": "^1.0.11", 3224 | "chokidar": "^3.5.3", 3225 | "colorette": "^2.0.10", 3226 | "compression": "^1.7.4", 3227 | "connect-history-api-fallback": "^1.6.0", 3228 | "default-gateway": "^6.0.3", 3229 | "express": "^4.17.3", 3230 | "graceful-fs": "^4.2.6", 3231 | "html-entities": "^2.3.2", 3232 | "http-proxy-middleware": "^2.0.3", 3233 | "ipaddr.js": "^2.0.1", 3234 | "open": "^8.0.9", 3235 | "p-retry": "^4.5.0", 3236 | "rimraf": "^3.0.2", 3237 | "schema-utils": "^4.0.0", 3238 | "selfsigned": "^2.0.1", 3239 | "serve-index": "^1.9.1", 3240 | "sockjs": "^0.3.24", 3241 | "spdy": "^4.0.2", 3242 | "webpack-dev-middleware": "^5.3.1", 3243 | "ws": "^8.4.2" 3244 | }, 3245 | "dependencies": { 3246 | "ajv": { 3247 | "version": "8.11.0", 3248 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 3249 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 3250 | "dev": true, 3251 | "requires": { 3252 | "fast-deep-equal": "^3.1.1", 3253 | "json-schema-traverse": "^1.0.0", 3254 | "require-from-string": "^2.0.2", 3255 | "uri-js": "^4.2.2" 3256 | } 3257 | }, 3258 | "ajv-keywords": { 3259 | "version": "5.1.0", 3260 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 3261 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 3262 | "dev": true, 3263 | "requires": { 3264 | "fast-deep-equal": "^3.1.3" 3265 | } 3266 | }, 3267 | "json-schema-traverse": { 3268 | "version": "1.0.0", 3269 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 3270 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 3271 | "dev": true 3272 | }, 3273 | "rimraf": { 3274 | "version": "3.0.2", 3275 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3276 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3277 | "dev": true, 3278 | "requires": { 3279 | "glob": "^7.1.3" 3280 | } 3281 | }, 3282 | "schema-utils": { 3283 | "version": "4.0.0", 3284 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", 3285 | "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", 3286 | "dev": true, 3287 | "requires": { 3288 | "@types/json-schema": "^7.0.9", 3289 | "ajv": "^8.8.0", 3290 | "ajv-formats": "^2.1.1", 3291 | "ajv-keywords": "^5.0.0" 3292 | } 3293 | } 3294 | } 3295 | }, 3296 | "webpack-merge": { 3297 | "version": "5.8.0", 3298 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", 3299 | "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", 3300 | "dev": true, 3301 | "requires": { 3302 | "clone-deep": "^4.0.1", 3303 | "wildcard": "^2.0.0" 3304 | } 3305 | }, 3306 | "webpack-sources": { 3307 | "version": "3.2.3", 3308 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 3309 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 3310 | "dev": true 3311 | }, 3312 | "websocket-driver": { 3313 | "version": "0.7.4", 3314 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 3315 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 3316 | "dev": true, 3317 | "requires": { 3318 | "http-parser-js": ">=0.5.1", 3319 | "safe-buffer": ">=5.1.0", 3320 | "websocket-extensions": ">=0.1.1" 3321 | } 3322 | }, 3323 | "websocket-extensions": { 3324 | "version": "0.1.4", 3325 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 3326 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", 3327 | "dev": true 3328 | }, 3329 | "which": { 3330 | "version": "2.0.2", 3331 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3332 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3333 | "dev": true, 3334 | "requires": { 3335 | "isexe": "^2.0.0" 3336 | } 3337 | }, 3338 | "wildcard": { 3339 | "version": "2.0.0", 3340 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", 3341 | "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", 3342 | "dev": true 3343 | }, 3344 | "wrappy": { 3345 | "version": "1.0.2", 3346 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3347 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3348 | "dev": true 3349 | }, 3350 | "ws": { 3351 | "version": "8.8.0", 3352 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", 3353 | "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", 3354 | "dev": true 3355 | }, 3356 | "yallist": { 3357 | "version": "4.0.0", 3358 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3359 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3360 | "dev": true 3361 | } 3362 | } 3363 | } 3364 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ants-simulation", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "dat.gui": "^0.7.9", 8 | "push-dir": "^0.4.1", 9 | "three": "^0.141.0" 10 | }, 11 | "devDependencies": { 12 | "@types/dat.gui": "^0.7.7", 13 | "@types/node": "^18.0.0", 14 | "@types/three": "^0.141.0", 15 | "clean-webpack-plugin": "^4.0.0", 16 | "copy-webpack-plugin": "^11.0.0", 17 | "html-webpack-plugin": "^5.5.0", 18 | "raw-loader": "^4.0.2", 19 | "ts-loader": "^9.3.1", 20 | "typescript": "^4.7.4", 21 | "webpack": "^5.73.0", 22 | "webpack-cli": "^4.10.0", 23 | "webpack-dev-server": "^4.9.2" 24 | }, 25 | "scripts": { 26 | "build": "webpack --config ./webpack.config.js --mode=production", 27 | "start": "webpack serve --config ./webpack.config.js --mode=development", 28 | "gh-pages": "npm run build && push-dir --dir=build --branch=gh-pages" 29 | }, 30 | "author": "", 31 | "license": "MIT" 32 | } 33 | -------------------------------------------------------------------------------- /src/App.ts: -------------------------------------------------------------------------------- 1 | import AntsComputeScene from "./scenes/AntsComputeScene"; 2 | import ScreenScene from "./scenes/ScreenScene"; 3 | import Renderer from "./Renderer"; 4 | import WorldComputeScene from "./scenes/WorldComputeScene"; 5 | import AntsDiscretizeScene from "./scenes/AntsDiscretizeScene"; 6 | import WorldBlurScene from "./scenes/WorldBlurScene"; 7 | import Config from "./Config"; 8 | import GUI from "./GUI"; 9 | import DrawScene from "./scenes/DrawScene"; 10 | 11 | export interface SceneCollection { 12 | ants: AntsComputeScene; 13 | world: WorldComputeScene; 14 | worldBlur: WorldBlurScene; 15 | discretize: AntsDiscretizeScene; 16 | screen: ScreenScene; 17 | draw: DrawScene; 18 | } 19 | 20 | export default new class App { 21 | private renderer: Renderer = new Renderer(document.getElementById('canvas')); 22 | private scenes: SceneCollection; 23 | private gui: GUI = new GUI(); 24 | private renderLoop = (time: number): void => this.render(time); 25 | private lastTime: number = 0; 26 | private queuedSimSteps: number = 0; 27 | 28 | constructor() { 29 | this.initScenes(); 30 | 31 | window.addEventListener('resize', () => this.resize()); 32 | 33 | this.resize(); 34 | 35 | this.renderLoop(0); 36 | 37 | this.gui.on('reset', () => { 38 | this.resetRenderer(); 39 | }); 40 | } 41 | 42 | private resetRenderer() { 43 | this.renderer.reset(this.scenes); 44 | } 45 | 46 | private initScenes() { 47 | this.scenes = { 48 | ants: new AntsComputeScene(this.renderer), 49 | world: new WorldComputeScene(this.renderer), 50 | worldBlur: new WorldBlurScene(this.renderer), 51 | discretize: new AntsDiscretizeScene(this.renderer), 52 | screen: new ScreenScene(this.renderer), 53 | draw: new DrawScene(this.renderer) 54 | }; 55 | } 56 | 57 | private resize() { 58 | const width = window.innerWidth * window.devicePixelRatio; 59 | const height = window.innerHeight * window.devicePixelRatio; 60 | 61 | this.renderer.resizeCanvas(width, height); 62 | 63 | for (const scene of Object.values(this.scenes)) { 64 | scene.resize(width, height); 65 | } 66 | } 67 | 68 | private simulationStep() { 69 | for (const scene of Object.values(this.scenes)) { 70 | scene.update(); 71 | } 72 | 73 | this.renderer.renderSimulation(this.scenes); 74 | } 75 | 76 | private render(time: number) { 77 | requestAnimationFrame(this.renderLoop); 78 | 79 | const deltaTime = time - this.lastTime; 80 | const simStepsToDo = deltaTime / 1000 * Config.simulationStepsPerSecond; 81 | 82 | this.queuedSimSteps += simStepsToDo; 83 | this.queuedSimSteps = Math.min(this.queuedSimSteps, 10); 84 | 85 | while (this.queuedSimSteps >= 1) { 86 | this.simulationStep(); 87 | --this.queuedSimSteps; 88 | } 89 | 90 | if (time === 0) { 91 | return; 92 | } 93 | 94 | this.renderer.renderToScreen(this.scenes); 95 | 96 | this.lastTime = time; 97 | } 98 | } -------------------------------------------------------------------------------- /src/Config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | worldSize: 1024, 3 | antsCount: 12, 4 | simulationStepsPerSecond: 60, 5 | scentThreshold: 0.01, 6 | scentFadeOutFactor: 0.001, 7 | scentBlurRadius: 0.1, 8 | scentMaxStorage: 1e6, 9 | scentPerMarker: 200, 10 | scentMaxPerCell: 10, 11 | antSpeed: 1, 12 | antRotationAngle: Math.PI / 30, 13 | brushRadius: 20, 14 | }; -------------------------------------------------------------------------------- /src/GUI.ts: -------------------------------------------------------------------------------- 1 | import * as dat from 'dat.gui'; 2 | import Config from "./Config"; 3 | import EventEmitter from "events"; 4 | 5 | export default class GUI extends EventEmitter { 6 | private gui: dat.GUI = new dat.GUI({ 7 | width: 400 8 | }); 9 | 10 | constructor() { 11 | super(); 12 | 13 | const simFolder = this.gui.addFolder('Simulation'); 14 | 15 | simFolder.add(Config, 'worldSize', 256, 4096) 16 | .name('World size') 17 | .step(1) 18 | .onChange(() => this.emit('reset')); 19 | simFolder.add(Config, 'antsCount', 0, 22) 20 | .name('Ants count 2^') 21 | .step(1) 22 | .onChange(() => this.emit('reset')); 23 | simFolder.add(Config, 'scentFadeOutFactor', 0, 0.01) 24 | .name('Pheromone evaporation factor') 25 | .step(0.0001) 26 | .onChange(() => this.emit('reset')); 27 | simFolder.add(Config, 'scentBlurRadius', 0, 0.5) 28 | .name('Pheromone diffusion factor') 29 | .step(0.01) 30 | .onChange(() => this.emit('reset')); 31 | simFolder.add(Config, 'simulationStepsPerSecond', 1, 500) 32 | .name('Simulation steps per second') 33 | .step(1); 34 | 35 | const controlsFolder = this.gui.addFolder('Controls'); 36 | 37 | controlsFolder.add(Config, 'brushRadius', 1, 100).name('Brush radius'); 38 | 39 | simFolder.open(); 40 | controlsFolder.open(); 41 | } 42 | } -------------------------------------------------------------------------------- /src/Renderer.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import {SceneCollection} from "./App"; 3 | import Config from "./Config"; 4 | import {WebGLRenderTarget} from "three"; 5 | 6 | interface Resources { 7 | worldRenderTarget: THREE.WebGLRenderTarget; 8 | worldRenderTargetCopy: THREE.WebGLRenderTarget; 9 | worldBlurredRenderTarget: THREE.WebGLRenderTarget; 10 | antsDataRenderTarget0: THREE.WebGLRenderTarget; 11 | antsDataRenderTarget1: THREE.WebGLRenderTarget; 12 | antsDiscreteRenderTarget: THREE.WebGLRenderTarget; 13 | } 14 | 15 | export default class Renderer { 16 | private renderer: THREE.WebGLRenderer; 17 | public resources: Resources; 18 | 19 | constructor(public canvas: HTMLCanvasElement) { 20 | this.renderer = new THREE.WebGLRenderer({canvas}) 21 | 22 | this.initResources(); 23 | } 24 | 25 | private initResources() { 26 | const antTextureSize = Math.round(Math.sqrt(2 ** Config.antsCount)); 27 | 28 | this.resources = { 29 | worldRenderTarget: new THREE.WebGLRenderTarget(Config.worldSize, Config.worldSize, { 30 | format: THREE.RGBAFormat, 31 | type: THREE.FloatType, 32 | depthBuffer: false, 33 | magFilter: THREE.LinearFilter, 34 | minFilter: THREE.LinearFilter, 35 | }), 36 | worldRenderTargetCopy: new THREE.WebGLRenderTarget(Config.worldSize, Config.worldSize, { 37 | format: THREE.RGBAFormat, 38 | type: THREE.FloatType, 39 | depthBuffer: false, 40 | magFilter: THREE.NearestFilter, 41 | minFilter: THREE.NearestFilter, 42 | }), 43 | worldBlurredRenderTarget: new THREE.WebGLRenderTarget(Config.worldSize, Config.worldSize, { 44 | format: THREE.RGBAFormat, 45 | type: THREE.FloatType, 46 | depthBuffer: false, 47 | magFilter: THREE.NearestFilter, 48 | minFilter: THREE.NearestFilter, 49 | }), 50 | antsDataRenderTarget0: new THREE.WebGLRenderTarget(antTextureSize, antTextureSize, { 51 | format: THREE.RGBAFormat, 52 | type: THREE.FloatType, 53 | depthBuffer: false, 54 | magFilter: THREE.NearestFilter, 55 | minFilter: THREE.NearestFilter, 56 | }), 57 | antsDataRenderTarget1: new THREE.WebGLRenderTarget(antTextureSize, antTextureSize, { 58 | format: THREE.RGBAFormat, 59 | type: THREE.FloatType, 60 | depthBuffer: false, 61 | magFilter: THREE.NearestFilter, 62 | minFilter: THREE.NearestFilter, 63 | }), 64 | antsDiscreteRenderTarget: new THREE.WebGLRenderTarget(Config.worldSize, Config.worldSize, { 65 | format: THREE.RGBAFormat, 66 | type: THREE.UnsignedByteType, 67 | depthBuffer: false, 68 | magFilter: THREE.NearestFilter, 69 | minFilter: THREE.NearestFilter, 70 | }) 71 | }; 72 | } 73 | 74 | public renderSimulation(scenes: SceneCollection) { 75 | const [antsComputeSource, antsComputeTarget] = scenes.ants.getRenderTargets(); 76 | 77 | this.setViewportFromRT(this.resources.worldBlurredRenderTarget); 78 | this.renderer.setRenderTarget(this.resources.worldBlurredRenderTarget); 79 | scenes.worldBlur.material.uniforms.tWorld.value = this.resources.worldRenderTarget.texture; 80 | this.renderer.render(scenes.worldBlur, scenes.worldBlur.camera); 81 | 82 | this.setViewportFromRT(antsComputeTarget); 83 | this.renderer.setRenderTarget(antsComputeTarget); 84 | scenes.ants.material.uniforms.tLastState.value = antsComputeSource.texture; 85 | scenes.ants.material.uniforms.tWorld.value = this.resources.worldBlurredRenderTarget.texture; 86 | this.renderer.render(scenes.ants, scenes.ants.camera); 87 | 88 | this.setViewportFromRT(this.resources.antsDiscreteRenderTarget); 89 | this.renderer.setRenderTarget(this.resources.antsDiscreteRenderTarget); 90 | scenes.discretize.material.uniforms.tDataCurrent.value = antsComputeTarget.texture; 91 | scenes.discretize.material.uniforms.tDataLast.value = antsComputeSource.texture; 92 | this.renderer.render(scenes.discretize, scenes.discretize.camera); 93 | 94 | this.setViewportFromRT(this.resources.worldRenderTarget); 95 | this.renderer.setRenderTarget(this.resources.worldRenderTarget); 96 | scenes.world.material.uniforms.tLastState.value = this.resources.worldBlurredRenderTarget.texture; 97 | scenes.world.material.uniforms.tDiscreteAnts.value = this.resources.antsDiscreteRenderTarget.texture; 98 | this.renderer.render(scenes.world, scenes.world.camera); 99 | 100 | scenes.screen.material.uniforms.tData.value = antsComputeTarget.texture; 101 | scenes.screen.groundMaterial.uniforms.map.value = this.resources.worldRenderTargetCopy.texture; 102 | } 103 | 104 | private setViewportFromRT(rt: WebGLRenderTarget) { 105 | this.renderer.setViewport(0, 0, rt.width, rt.height); 106 | } 107 | 108 | public renderToScreen(scenes: SceneCollection) { 109 | this.setViewportFromRT(this.resources.worldRenderTargetCopy); 110 | this.renderer.setRenderTarget(this.resources.worldRenderTargetCopy); 111 | scenes.draw.material.uniforms.tWorld.value = this.resources.worldRenderTarget.texture; 112 | scenes.draw.material.uniforms.pointerPosition.value = scenes.screen.pointerPosition; 113 | scenes.draw.material.uniforms.drawMode.value = scenes.screen.drawMode; 114 | scenes.draw.material.uniforms.brushRadius.value = Config.brushRadius; 115 | this.renderer.render(scenes.draw, scenes.draw.camera); 116 | this.renderer.copyFramebufferToTexture(new THREE.Vector2(), this.resources.worldRenderTarget.texture); 117 | 118 | this.renderer.setViewport(0, 0, scenes.screen.renderWidth, scenes.screen.renderHeight); 119 | this.renderer.setRenderTarget(null); 120 | this.renderer.render(scenes.screen, scenes.screen.camera); 121 | } 122 | 123 | public resizeCanvas(width: number, height: number) { 124 | this.canvas.width = width; 125 | this.canvas.height = height; 126 | } 127 | 128 | public getCommonMaterialDefines(): Record { 129 | return { 130 | WORLD_SIZE: Renderer.convertNumberToFloatString(Config.worldSize), 131 | SCENT_THRESHOLD: Renderer.convertNumberToFloatString(Config.scentThreshold), 132 | SCENT_FADE_OUT_FACTOR: Renderer.convertNumberToFloatString(Config.scentFadeOutFactor), 133 | SCENT_BLUR_RADIUS: Renderer.convertNumberToFloatString(Config.scentBlurRadius), 134 | SCENT_MAX_STORAGE: Renderer.convertNumberToFloatString(Config.scentMaxStorage), 135 | SCENT_PER_MARKER: Renderer.convertNumberToFloatString(Config.scentPerMarker), 136 | SCENT_MAX_PER_CELL: Renderer.convertNumberToFloatString(Config.scentMaxPerCell), 137 | ANT_SPEED: Renderer.convertNumberToFloatString(Config.antSpeed), 138 | ANT_ROTATION_ANGLE: Renderer.convertNumberToFloatString(Config.antRotationAngle) 139 | }; 140 | } 141 | 142 | public reset(scenes: SceneCollection) { 143 | const antTextureSize = Math.round(Math.sqrt(2 ** Config.antsCount)); 144 | 145 | this.resources.worldRenderTarget.setSize(Config.worldSize, Config.worldSize) 146 | this.renderer.setRenderTarget(this.resources.worldRenderTarget); 147 | this.renderer.clear(); 148 | 149 | this.resources.worldRenderTargetCopy.setSize(Config.worldSize, Config.worldSize) 150 | this.renderer.setRenderTarget(this.resources.worldRenderTargetCopy); 151 | this.renderer.clear(); 152 | 153 | this.resources.worldBlurredRenderTarget.setSize(Config.worldSize, Config.worldSize) 154 | this.renderer.setRenderTarget(this.resources.worldBlurredRenderTarget); 155 | this.renderer.clear(); 156 | 157 | this.resources.antsDataRenderTarget0.setSize(antTextureSize, antTextureSize) 158 | this.renderer.setRenderTarget(this.resources.antsDataRenderTarget0); 159 | this.renderer.clear(); 160 | 161 | this.resources.antsDataRenderTarget1.setSize(antTextureSize, antTextureSize) 162 | this.renderer.setRenderTarget(this.resources.antsDataRenderTarget1); 163 | this.renderer.clear(); 164 | 165 | this.resources.antsDiscreteRenderTarget.setSize(Config.worldSize, Config.worldSize) 166 | this.renderer.setRenderTarget(this.resources.antsDiscreteRenderTarget); 167 | this.renderer.clear(); 168 | 169 | for (const scene of Object.values(scenes)) { 170 | scene.recompileMaterials(); 171 | } 172 | } 173 | 174 | static convertNumberToFloatString(n: number): string { 175 | return n.toFixed(8); 176 | } 177 | } -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vert' { 2 | const content: string; 3 | export default content; 4 | } 5 | declare module '*.frag' { 6 | const content: string; 7 | export default content; 8 | } -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ants simulation 7 | 31 | 32 | 33 |
Controls:
Q - draw home cells
W - draw food cells
E - draw obstacle
R - erase
Drag and scroll to move the camera
34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/scenes/AbstractScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import Renderer from "../Renderer"; 3 | 4 | export default abstract class AbstractScene extends THREE.Scene { 5 | protected readonly renderer: Renderer; 6 | public readonly camera: THREE.Camera; 7 | 8 | protected constructor(renderer: Renderer) { 9 | super(); 10 | 11 | this.renderer = renderer; 12 | } 13 | 14 | public abstract recompileMaterials(): void; 15 | 16 | public abstract resize(width: number, height: number): void; 17 | 18 | public abstract update(): void; 19 | } -------------------------------------------------------------------------------- /src/scenes/AntsComputeScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import {WebGLRenderTarget} from 'three'; 3 | import Renderer from "../Renderer"; 4 | import AbstractScene from "./AbstractScene"; 5 | import FullScreenTriangleGeometry from "../utils/FullScreenTriangleGeometry"; 6 | import fragmentShader from '../shaders/antsCompute.frag'; 7 | import vertexShader from '../shaders/antsCompute.vert'; 8 | 9 | export default class AntsComputeScene extends AbstractScene { 10 | public camera: THREE.OrthographicCamera = new THREE.OrthographicCamera(); 11 | public material: THREE.RawShaderMaterial; 12 | private renderTargets: [WebGLRenderTarget, WebGLRenderTarget]; 13 | 14 | constructor(renderer: Renderer) { 15 | super(renderer); 16 | 17 | const geometry = new FullScreenTriangleGeometry(); 18 | const material = new THREE.RawShaderMaterial({ 19 | uniforms: { 20 | uTime: {value: 0}, 21 | tLastState: {value: null}, 22 | tWorld: {value: null}, 23 | }, 24 | vertexShader, 25 | fragmentShader, 26 | defines: this.renderer.getCommonMaterialDefines(), 27 | glslVersion: THREE.GLSL3 28 | }); 29 | const mesh = new THREE.Mesh(geometry, material); 30 | this.add(mesh); 31 | 32 | this.material = material; 33 | 34 | this.renderTargets = [ 35 | this.renderer.resources.antsDataRenderTarget0, 36 | this.renderer.resources.antsDataRenderTarget1 37 | ]; 38 | } 39 | 40 | public getRenderTargets(): [WebGLRenderTarget, WebGLRenderTarget] { 41 | this.renderTargets.reverse(); 42 | 43 | return this.renderTargets; 44 | } 45 | 46 | public recompileMaterials() { 47 | this.material.defines = this.renderer.getCommonMaterialDefines(); 48 | this.material.needsUpdate = true; 49 | } 50 | 51 | public resize(width: number, height: number) { 52 | 53 | } 54 | 55 | public update() { 56 | this.material.uniforms.uTime.value = performance.now(); 57 | } 58 | } -------------------------------------------------------------------------------- /src/scenes/AntsDiscretizeScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import Renderer from "../Renderer"; 3 | import AbstractScene from "./AbstractScene"; 4 | import fragmentShader from '../shaders/antsDiscretize.frag'; 5 | import vertexShader from '../shaders/antsDiscretize.vert'; 6 | 7 | export default class AntsDiscretizeScene extends AbstractScene { 8 | public readonly camera: THREE.OrthographicCamera = new THREE.OrthographicCamera(); 9 | public readonly material: THREE.RawShaderMaterial; 10 | public mesh: THREE.InstancedMesh; 11 | 12 | constructor(renderer: Renderer) { 13 | super(renderer); 14 | 15 | this.material = new THREE.RawShaderMaterial({ 16 | uniforms: { 17 | tDataCurrent: {value: null}, 18 | tDataLast: {value: null}, 19 | }, 20 | vertexShader, 21 | fragmentShader, 22 | defines: this.renderer.getCommonMaterialDefines(), 23 | glslVersion: THREE.GLSL3 24 | }); 25 | 26 | this.createMesh(); 27 | } 28 | 29 | private createMesh() { 30 | if (this.mesh) { 31 | this.remove(this.mesh); 32 | this.mesh.dispose(); 33 | } 34 | 35 | this.mesh = new THREE.InstancedMesh( 36 | new THREE.BoxBufferGeometry(1, 1, 1), 37 | this.material, 38 | this.renderer.resources.antsDataRenderTarget0.width * this.renderer.resources.antsDataRenderTarget0.height 39 | ); 40 | this.add(this.mesh); 41 | } 42 | 43 | public recompileMaterials() { 44 | this.material.defines = this.renderer.getCommonMaterialDefines(); 45 | this.material.needsUpdate = true; 46 | this.createMesh(); 47 | } 48 | 49 | public resize(width: number, height: number) { 50 | 51 | } 52 | 53 | public update() { 54 | 55 | } 56 | } -------------------------------------------------------------------------------- /src/scenes/DrawScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import Renderer from "../Renderer"; 3 | import AbstractScene from "./AbstractScene"; 4 | import FullScreenTriangleGeometry from "../utils/FullScreenTriangleGeometry"; 5 | import fragmentShader from '../shaders/draw.frag'; 6 | import vertexShader from '../shaders/draw.vert'; 7 | 8 | export default class DrawScene extends AbstractScene { 9 | public readonly camera: THREE.OrthographicCamera = new THREE.OrthographicCamera(); 10 | public readonly material: THREE.RawShaderMaterial; 11 | 12 | constructor(renderer: Renderer) { 13 | super(renderer); 14 | 15 | const geometry = new FullScreenTriangleGeometry(); 16 | const material = new THREE.RawShaderMaterial({ 17 | uniforms: { 18 | tWorld: {value: null}, 19 | pointerPosition: {value: new THREE.Vector2()}, 20 | drawMode: {value: 0}, 21 | brushRadius: {value: 0}, 22 | }, 23 | vertexShader, 24 | fragmentShader, 25 | defines: this.renderer.getCommonMaterialDefines(), 26 | glslVersion: THREE.GLSL3 27 | }); 28 | const mesh = new THREE.Mesh(geometry, material); 29 | this.add(mesh); 30 | 31 | this.material = material; 32 | } 33 | 34 | public recompileMaterials() { 35 | this.material.defines = this.renderer.getCommonMaterialDefines(); 36 | this.material.needsUpdate = true; 37 | } 38 | 39 | public resize(width: number, height: number) { 40 | 41 | } 42 | 43 | public update() { 44 | 45 | } 46 | } -------------------------------------------------------------------------------- /src/scenes/ScreenScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import Renderer from "../Renderer"; 3 | import AbstractScene from "./AbstractScene"; 4 | import vertexShaderAnts from "../shaders/ants.vert"; 5 | import fragmentShaderAnts from "../shaders/ants.frag"; 6 | import vertexShaderGround from "../shaders/screenWorld.vert"; 7 | import fragmentShaderGround from "../shaders/screenWorld.frag"; 8 | import Config from "../Config"; 9 | 10 | enum PointerState { 11 | None, 12 | Food, 13 | Home, 14 | Obstacle, 15 | Erase 16 | } 17 | 18 | export default class ScreenScene extends AbstractScene { 19 | public readonly camera: THREE.OrthographicCamera; 20 | public readonly material: THREE.ShaderMaterial; 21 | public ants: THREE.InstancedMesh; 22 | public readonly groundMaterial: THREE.ShaderMaterial; 23 | public readonly pointerPosition: THREE.Vector2 = new THREE.Vector2(); 24 | public drawMode: PointerState = PointerState.None; 25 | private cameraZoomLinear: number = 0; 26 | private isPointerDown: boolean = false; 27 | public renderWidth: number = 1; 28 | public renderHeight: number = 1; 29 | 30 | constructor(renderer: Renderer) { 31 | super(renderer); 32 | 33 | const ground = new THREE.Mesh( 34 | new THREE.PlaneBufferGeometry(1, 1), 35 | new THREE.ShaderMaterial({ 36 | uniforms: { 37 | map: {value: this.renderer.resources.worldRenderTarget.texture} 38 | }, 39 | vertexShader: vertexShaderGround, 40 | fragmentShader: fragmentShaderGround, 41 | defines: this.renderer.getCommonMaterialDefines(), 42 | glslVersion: THREE.GLSL3 43 | }) 44 | ); 45 | 46 | this.groundMaterial = ground.material; 47 | 48 | this.add(ground); 49 | 50 | const antTexture = new THREE.TextureLoader().load('textures/ant.png'); 51 | const foodTexture = new THREE.TextureLoader().load('textures/food.png'); 52 | 53 | antTexture.magFilter = foodTexture.magFilter = THREE.NearestFilter; 54 | antTexture.minFilter = foodTexture.minFilter = THREE.LinearMipMapLinearFilter; 55 | 56 | this.material = new THREE.ShaderMaterial({ 57 | uniforms: { 58 | tData: {value: this.renderer.resources.antsDataRenderTarget0.texture}, 59 | tAnt: {value: antTexture}, 60 | tFood: {value: foodTexture} 61 | }, 62 | vertexShader: vertexShaderAnts, 63 | fragmentShader: fragmentShaderAnts, 64 | transparent: true 65 | }); 66 | 67 | this.createInstancedAntsMesh(); 68 | 69 | this.camera = new THREE.OrthographicCamera(-0.5, 0.5, 0.5, -0.5); 70 | 71 | this.add(this.camera); 72 | 73 | this.camera.position.z = 12; 74 | 75 | const raycastVector = new THREE.Vector2(0, 0); 76 | const raycaster = new THREE.Raycaster(); 77 | 78 | this.renderer.canvas.addEventListener('contextmenu', e => { 79 | e.preventDefault(); 80 | }); 81 | 82 | this.renderer.canvas.addEventListener('pointerdown', e => { 83 | this.isPointerDown = true; 84 | 85 | raycastVector.x = (e.clientX / window.innerWidth) * 2 - 1; 86 | raycastVector.y = -(e.clientY / window.innerHeight) * 2 + 1; 87 | 88 | raycaster.setFromCamera(raycastVector, this.camera); 89 | 90 | const intersects = raycaster.intersectObjects([ground]); 91 | 92 | if (intersects.length > 0) { 93 | const uv = intersects[0].uv; 94 | this.pointerPosition.copy(uv); 95 | } 96 | }); 97 | 98 | this.renderer.canvas.addEventListener('pointermove', e => { 99 | if (this.isPointerDown) { 100 | const dx = e.movementX; 101 | const dy = e.movementY; 102 | 103 | this.camera.position.x -= dx / window.innerHeight / this.camera.zoom; 104 | this.camera.position.y += dy / window.innerHeight / this.camera.zoom; 105 | } 106 | 107 | raycastVector.x = (e.clientX / window.innerWidth) * 2 - 1; 108 | raycastVector.y = -(e.clientY / window.innerHeight) * 2 + 1; 109 | 110 | raycaster.setFromCamera(raycastVector, this.camera); 111 | 112 | const intersects = raycaster.intersectObjects([ground]); 113 | 114 | if (intersects.length > 0) { 115 | const uv = intersects[0].uv; 116 | this.pointerPosition.copy(uv); 117 | } 118 | }); 119 | 120 | this.renderer.canvas.addEventListener('pointerup', e => { 121 | this.isPointerDown = false; 122 | }); 123 | 124 | this.renderer.canvas.addEventListener('pointerleave', e => { 125 | this.isPointerDown = false; 126 | }); 127 | 128 | this.renderer.canvas.addEventListener('wheel', e => { 129 | this.cameraZoomLinear -= e.deltaY * 0.001; 130 | 131 | this.updateCameraZoom(); 132 | }); 133 | 134 | window.addEventListener('keydown', e => { 135 | switch (e.code) { 136 | case 'KeyQ': { 137 | this.drawMode = PointerState.Home; 138 | break; 139 | } 140 | case 'KeyW': { 141 | this.drawMode = PointerState.Food; 142 | break; 143 | } 144 | case 'KeyE': { 145 | this.drawMode = PointerState.Obstacle; 146 | break; 147 | } 148 | case 'KeyR': { 149 | this.drawMode = PointerState.Erase; 150 | break; 151 | } 152 | } 153 | }); 154 | 155 | window.addEventListener('keyup', e => { 156 | this.drawMode = PointerState.None; 157 | }); 158 | } 159 | 160 | private updateCameraZoom() { 161 | this.camera.zoom = 2 ** this.cameraZoomLinear; 162 | this.camera.updateProjectionMatrix(); 163 | } 164 | 165 | private createInstancedAntsMesh() { 166 | if (this.ants) { 167 | this.remove(this.ants); 168 | this.ants.dispose(); 169 | } 170 | 171 | const scale = 8 / Config.worldSize; 172 | 173 | const ants = new THREE.InstancedMesh( 174 | new THREE.PlaneBufferGeometry(scale, scale), 175 | this.material, 176 | this.renderer.resources.antsDataRenderTarget0.width * this.renderer.resources.antsDataRenderTarget0.height 177 | ) 178 | 179 | ants.position.x = ants.position.y = -0.5; 180 | 181 | this.add(ants); 182 | 183 | this.ants = ants; 184 | } 185 | 186 | public recompileMaterials() { 187 | this.groundMaterial.defines = this.renderer.getCommonMaterialDefines(); 188 | this.groundMaterial.needsUpdate = true; 189 | this.createInstancedAntsMesh(); 190 | } 191 | 192 | public resize(width: number, height: number) { 193 | const aspect = width / height; 194 | 195 | this.camera.left = -0.5 * aspect; 196 | this.camera.right = 0.5 * aspect; 197 | this.camera.top = 0.5; 198 | this.camera.bottom = -0.5; 199 | 200 | this.camera.updateProjectionMatrix(); 201 | 202 | this.renderWidth = width; 203 | this.renderHeight = height; 204 | } 205 | 206 | public update() { 207 | 208 | } 209 | } -------------------------------------------------------------------------------- /src/scenes/WorldBlurScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import Renderer from "../Renderer"; 3 | import AbstractScene from "./AbstractScene"; 4 | import FullScreenTriangleGeometry from "../utils/FullScreenTriangleGeometry"; 5 | import fragmentShader from '../shaders/worldBlur.frag'; 6 | import vertexShader from '../shaders/worldBlur.vert'; 7 | 8 | export default class WorldBlurScene extends AbstractScene { 9 | public readonly camera: THREE.OrthographicCamera = new THREE.OrthographicCamera(); 10 | public readonly material: THREE.RawShaderMaterial; 11 | 12 | constructor(renderer: Renderer) { 13 | super(renderer); 14 | 15 | const geometry = new FullScreenTriangleGeometry(); 16 | const material = new THREE.RawShaderMaterial({ 17 | uniforms: { 18 | tWorld: {value: null}, 19 | }, 20 | vertexShader, 21 | fragmentShader, 22 | defines: this.renderer.getCommonMaterialDefines(), 23 | glslVersion: THREE.GLSL3 24 | }); 25 | const mesh = new THREE.Mesh(geometry, material); 26 | this.add(mesh); 27 | 28 | this.material = material; 29 | } 30 | 31 | public recompileMaterials() { 32 | this.material.defines = this.renderer.getCommonMaterialDefines(); 33 | this.material.needsUpdate = true; 34 | } 35 | 36 | public resize(width: number, height: number) { 37 | 38 | } 39 | 40 | public update() { 41 | 42 | } 43 | } -------------------------------------------------------------------------------- /src/scenes/WorldComputeScene.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import Renderer from "../Renderer"; 3 | import AbstractScene from "./AbstractScene"; 4 | import FullScreenTriangleGeometry from "../utils/FullScreenTriangleGeometry"; 5 | import fragmentShader from '../shaders/world.frag'; 6 | import vertexShader from '../shaders/world.vert'; 7 | 8 | export default class WorldComputeScene extends AbstractScene { 9 | public readonly camera: THREE.OrthographicCamera = new THREE.OrthographicCamera(); 10 | public readonly material: THREE.RawShaderMaterial; 11 | 12 | constructor(renderer: Renderer) { 13 | super(renderer); 14 | 15 | const geometry = new FullScreenTriangleGeometry(); 16 | const material = new THREE.RawShaderMaterial({ 17 | uniforms: { 18 | tLastState: {value: null}, 19 | tDiscreteAnts: {value: null} 20 | }, 21 | vertexShader, 22 | fragmentShader, 23 | defines: this.renderer.getCommonMaterialDefines(), 24 | glslVersion: THREE.GLSL3 25 | }); 26 | const mesh = new THREE.Mesh(geometry, material); 27 | this.add(mesh); 28 | 29 | this.material = material; 30 | } 31 | 32 | public recompileMaterials() { 33 | this.material.defines = this.renderer.getCommonMaterialDefines(); 34 | this.material.needsUpdate = true; 35 | } 36 | 37 | public resize(width: number, height: number) { 38 | 39 | } 40 | 41 | public update() { 42 | 43 | } 44 | } -------------------------------------------------------------------------------- /src/shaders/ants.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec2 vUv; 5 | in float vIsCarryingFood; 6 | 7 | uniform sampler2D tAnt; 8 | uniform sampler2D tFood; 9 | 10 | void main() { 11 | vec4 antColor = texture(tAnt, vUv); 12 | vec4 foodColor = texture(tFood, vUv); 13 | 14 | pc_fragColor = mix(antColor, foodColor, foodColor.a * vIsCarryingFood); 15 | } -------------------------------------------------------------------------------- /src/shaders/ants.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | #define PI 3.1415926535897932384626433832795 5 | 6 | varying vec2 vUv; 7 | varying float vIsCarryingFood; 8 | 9 | uniform sampler2D tData; 10 | 11 | vec2 rotate(vec2 v, float a) { 12 | float s = sin(a); 13 | float c = cos(a); 14 | mat2 m = mat2(c, -s, s, c); 15 | return m * v; 16 | } 17 | 18 | void main() { 19 | vUv = uv; 20 | 21 | float dataTextureSize = vec2(textureSize(tData, 0)).x; 22 | 23 | float id = float(gl_InstanceID); 24 | float sampleY = floor(id / dataTextureSize); 25 | float sampleX = id - sampleY * dataTextureSize; 26 | vec2 antDataUV = (vec2(sampleX, sampleY) + 0.5) / dataTextureSize; 27 | 28 | vec4 dataSample = texture(tData, antDataUV); 29 | 30 | vec2 offset = dataSample.xy; 31 | vec2 rotatedPosition = rotate(position.xy, -dataSample.z + PI * 0.5); 32 | 33 | vIsCarryingFood = float(int(dataSample.w) & 1); 34 | 35 | gl_Position = projectionMatrix * modelViewMatrix * vec4(vec2(rotatedPosition + offset), 0, 1); 36 | } -------------------------------------------------------------------------------- /src/shaders/antsCompute.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | #define PI 3.1415926535897932384626433832795 5 | 6 | in vec2 vUv; 7 | 8 | out vec4 FragColor; 9 | 10 | uniform float uTime; 11 | uniform sampler2D tLastState; 12 | uniform sampler2D tWorld; 13 | 14 | const float sampleDistance = 20.; 15 | const float cellSize = 1. / WORLD_SIZE; 16 | 17 | float rand(vec2 co) { 18 | float a = 12.9898; 19 | float b = 78.233; 20 | float c = 43758.5453; 21 | float dt = dot(co.xy ,vec2(a,b)); 22 | float sn = mod(dt, 3.14); 23 | return fract(sin(sn) * c); 24 | } 25 | 26 | vec2 roundUvToCellCenter(vec2 uv) { 27 | return floor(uv * WORLD_SIZE) / WORLD_SIZE + cellSize * 0.5; 28 | } 29 | 30 | bool tryGetFood(vec2 pos) { 31 | float value = texture(tWorld, roundUvToCellCenter(pos)).x; 32 | 33 | return (int(value) & 1) == 1; 34 | } 35 | 36 | bool tryDropFood(vec2 pos) { 37 | float value = texture(tWorld, roundUvToCellCenter(pos)).x; 38 | 39 | return ((int(value) & 2) >> 1) == 1; 40 | } 41 | 42 | bool isObstacle(vec2 pos) { 43 | float value = texture(tWorld, roundUvToCellCenter(pos)).x; 44 | 45 | return ((int(value) & 4) >> 2) == 1; 46 | } 47 | 48 | float smell(vec2 pos, float isCarrying) { 49 | vec2 value = texture(tWorld, pos).yz; 50 | 51 | if (isCarrying > 0.5) { 52 | return value.y; 53 | } 54 | 55 | return value.x; 56 | } 57 | 58 | vec2 applyOffsetToPos(vec2 pos, vec2 offsetDirectaion) { 59 | vec2 newPos = clamp(pos + offsetDirectaion * cellSize, 0., 1.); 60 | 61 | if (!isObstacle(pos) && isObstacle(newPos)) { 62 | return pos; 63 | } 64 | 65 | return newPos; 66 | } 67 | 68 | float getMaxScentStorage(vec2 antDataUv) { 69 | float factor = 0.8 + rand(antDataUv * 100.) * 0.2; 70 | 71 | return SCENT_MAX_STORAGE * factor; 72 | } 73 | 74 | void main() { 75 | vec4 lastState = texture(tLastState, vUv); 76 | 77 | float noise = rand(vUv * 1000. + fract(uTime / 1000.)); 78 | 79 | vec2 pos = lastState.xy; 80 | float angle = lastState.z; 81 | float isCarrying = float(int(lastState.w) & 1); 82 | float storage = float(int(lastState.w) >> 1); 83 | bool wasObstacle = isObstacle(pos); 84 | 85 | bool movementProcessed = false; 86 | 87 | if (pos == vec2(0)) { // init new ant 88 | pos = vec2(0.5); 89 | angle = rand(vUv * 10000.) * 2. * PI; 90 | isCarrying = 0.; 91 | storage = 0.; 92 | } 93 | 94 | if (isCarrying == 0.) { 95 | if (noise < 0.33) { 96 | vec2 offset = vec2(cos(angle), sin(angle)) * sampleDistance; 97 | vec2 point = applyOffsetToPos(pos, offset); 98 | 99 | if (tryGetFood(point)) { 100 | movementProcessed = true; 101 | } 102 | } else if (noise < 0.66) { 103 | float newAngle = angle - ANT_ROTATION_ANGLE; 104 | vec2 offset = vec2(cos(newAngle), sin(newAngle)) * sampleDistance; 105 | vec2 point = applyOffsetToPos(pos, offset); 106 | 107 | if (tryGetFood(point)) { 108 | movementProcessed = true; 109 | angle = newAngle; 110 | } 111 | } else { 112 | float newAngle = angle + ANT_ROTATION_ANGLE; 113 | vec2 offset = vec2(cos(newAngle), sin(newAngle)) * sampleDistance; 114 | vec2 point = applyOffsetToPos(pos, offset); 115 | 116 | if (tryGetFood(point)) { 117 | movementProcessed = true; 118 | angle = newAngle; 119 | } 120 | } 121 | } else if (isCarrying == 1.) { 122 | if (noise < 0.33) { 123 | vec2 offset = vec2(cos(angle), sin(angle)) * sampleDistance; 124 | vec2 point = applyOffsetToPos(pos, offset); 125 | 126 | if (tryDropFood(point)) { 127 | movementProcessed = true; 128 | } 129 | } else if (noise < 0.66) { 130 | float newAngle = angle - ANT_ROTATION_ANGLE; 131 | vec2 offset = vec2(cos(newAngle), sin(newAngle)) * sampleDistance; 132 | vec2 point = applyOffsetToPos(pos, offset); 133 | 134 | if (tryDropFood(point)) { 135 | movementProcessed = true; 136 | angle = newAngle; 137 | } 138 | } else { 139 | float newAngle = angle + ANT_ROTATION_ANGLE; 140 | vec2 offset = vec2(cos(newAngle), sin(newAngle)) * sampleDistance; 141 | vec2 point = applyOffsetToPos(pos, offset); 142 | 143 | if (tryDropFood(point)) { 144 | movementProcessed = true; 145 | angle = newAngle; 146 | } 147 | } 148 | } 149 | 150 | if (!movementProcessed) { 151 | float noise2 = rand(vUv * 1000. + fract(uTime / 1000.) + 0.2); 152 | 153 | float sampleAhead = smell(applyOffsetToPos(pos, vec2(cos(angle), sin(angle)) * sampleDistance), isCarrying); 154 | float sampleLeft = smell(applyOffsetToPos(pos, vec2(cos(angle - ANT_ROTATION_ANGLE), sin(angle - ANT_ROTATION_ANGLE)) * sampleDistance), isCarrying); 155 | float sampleRight = smell(applyOffsetToPos(pos, vec2(cos(angle + ANT_ROTATION_ANGLE), sin(angle + ANT_ROTATION_ANGLE)) * sampleDistance), isCarrying); 156 | 157 | if (sampleAhead > sampleLeft && sampleAhead > sampleRight) { 158 | // don't change direction 159 | } else if (sampleLeft > sampleAhead && sampleLeft > sampleRight) { 160 | angle -= ANT_ROTATION_ANGLE; // steer left 161 | } else if (sampleRight > sampleAhead && sampleRight > sampleLeft) { 162 | angle += ANT_ROTATION_ANGLE; // steer right 163 | } else if (noise < 0.33) { 164 | angle += ANT_ROTATION_ANGLE; // no smell detected, do random movement 165 | } else if (noise < 0.66) { 166 | angle -= ANT_ROTATION_ANGLE; 167 | } 168 | 169 | if (noise2 > 0.5) { 170 | angle += ANT_ROTATION_ANGLE * 2.; 171 | } else { 172 | angle -= ANT_ROTATION_ANGLE * 2.; 173 | } 174 | } 175 | 176 | vec2 offset = vec2(cos(angle), sin(angle)); 177 | pos = applyOffsetToPos(pos, offset); 178 | 179 | if (fract(pos.x) == 0. || fract(pos.y) == 0. || (!wasObstacle && isObstacle(pos + offset * cellSize))) { 180 | angle += PI * (noise - 0.5); 181 | } 182 | 183 | if (tryGetFood(pos) && isCarrying == 0.) { 184 | isCarrying = 1.; 185 | angle += PI; 186 | storage = getMaxScentStorage(vUv); 187 | } 188 | 189 | if (tryDropFood(pos)) { 190 | storage = getMaxScentStorage(vUv); 191 | 192 | if (isCarrying == 1.) { 193 | isCarrying = 0.; 194 | angle += PI; 195 | } 196 | } 197 | 198 | FragColor = vec4( 199 | pos.x, 200 | pos.y, 201 | angle, 202 | float((uint(max(storage - SCENT_PER_MARKER, 0.)) << 1) + uint(isCarrying)) 203 | ); 204 | } -------------------------------------------------------------------------------- /src/shaders/antsCompute.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec3 position; 5 | in vec2 uv; 6 | 7 | out vec2 vUv; 8 | 9 | void main() { 10 | vUv = uv; 11 | gl_Position = vec4(position, 1.0); 12 | } -------------------------------------------------------------------------------- /src/shaders/antsDiscretize.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec2 vUv; 5 | in float vIsCarryingFood; 6 | in float vScentFactor; 7 | in float vIsCellCleared; 8 | 9 | out vec4 FragColor; 10 | 11 | void main() { 12 | FragColor = vec4(vIsCarryingFood * vScentFactor, (1. - vIsCarryingFood) * vScentFactor, vIsCellCleared, 1); 13 | } -------------------------------------------------------------------------------- /src/shaders/antsDiscretize.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec3 position; 5 | in vec2 uv; 6 | 7 | out vec2 vUv; 8 | out float vIsCarryingFood; 9 | out float vScentFactor; 10 | out float vIsCellCleared; 11 | 12 | uniform sampler2D tDataCurrent; 13 | uniform sampler2D tDataLast; 14 | 15 | const float cellSize = 1. / WORLD_SIZE; 16 | 17 | void main() { 18 | vUv = uv; 19 | 20 | float dataTextureSize = vec2(textureSize(tDataCurrent, 0)).x; 21 | 22 | float id = float(gl_InstanceID); 23 | float sampleY = floor(id / dataTextureSize); 24 | float sampleX = id - sampleY * dataTextureSize; 25 | 26 | vec4 dataSampleCurrent = texture(tDataCurrent, vec2(sampleX, sampleY) / dataTextureSize); 27 | vec4 dataSampleLast = texture(tDataLast, vec2(sampleX, sampleY) / dataTextureSize); 28 | vec2 offset = dataSampleCurrent.xy; 29 | 30 | float isCarrying = float(int(dataSampleCurrent.w) & 1); 31 | float wasCarrying = float(int(dataSampleLast.w) & 1); 32 | float isCellCleared = float(wasCarrying == 0. && isCarrying == 1.); 33 | 34 | float storage = float(int(dataSampleCurrent.w) >> 1); 35 | 36 | vIsCarryingFood = isCarrying; 37 | vScentFactor = storage / SCENT_MAX_STORAGE; 38 | vIsCellCleared = isCellCleared; 39 | 40 | gl_Position = vec4( 41 | (position.xy * cellSize + floor(offset * WORLD_SIZE) / WORLD_SIZE + cellSize * 0.5) * 2. - 1., 42 | 0, 43 | 1 44 | ); 45 | } -------------------------------------------------------------------------------- /src/shaders/draw.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec2 vUv; 5 | 6 | out vec4 FragColor; 7 | 8 | uniform sampler2D tWorld; 9 | uniform vec2 pointerPosition; 10 | uniform float drawMode; 11 | uniform float brushRadius; 12 | 13 | void main() { 14 | vec4 lastState = texture(tWorld, vUv); 15 | 16 | int cellData = int(lastState.x); 17 | int isFood = cellData & 1; 18 | int isHome = (cellData & 2) >> 1; 19 | int isObstacle = (cellData & 4) >> 2; 20 | 21 | if (distance(pointerPosition, vUv) < brushRadius / WORLD_SIZE) { 22 | if (drawMode == 1.) { 23 | isFood = 1; 24 | } else if (drawMode == 2.) { 25 | isHome = 1; 26 | } else if (drawMode == 3.) { 27 | isObstacle = 1; 28 | } else if (drawMode == 4.) { 29 | isFood = 0; 30 | isHome = 0; 31 | isObstacle = 0; 32 | } 33 | } 34 | 35 | FragColor = vec4(float(isFood + (isHome << 1) + (isObstacle << 2)), lastState.yzw); 36 | } -------------------------------------------------------------------------------- /src/shaders/draw.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec3 position; 5 | in vec2 uv; 6 | 7 | out vec2 vUv; 8 | 9 | void main() { 10 | vUv = uv; 11 | gl_Position = vec4(position, 1.0); 12 | } -------------------------------------------------------------------------------- /src/shaders/screenWorld.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec2 vUv; 5 | 6 | out vec4 FragColor; 7 | 8 | uniform sampler2D map; 9 | 10 | void main() { 11 | vec4 value = texture(map, vUv); 12 | 13 | int cellData = int(value.x); 14 | int isFood = cellData & 1; 15 | int isHome = (cellData & 2) >> 1; 16 | int isObstacle = (cellData & 4) >> 2; 17 | float toFood = clamp(value.y, 0., 1.); 18 | float toHome = clamp(value.z, 0., 1.); 19 | 20 | // The part below doen't seem right. 21 | // I could figure out a better way to make pheromone colors blend properly on white background :( 22 | 23 | vec3 t = vec3(0.95, 0.2, 0.2) * toFood + vec3(0.2, 0.2, 0.95) * toHome; 24 | float a = clamp(toHome + toFood, 0., 1.); 25 | 26 | t /= a; 27 | 28 | if (a == 0.) t = vec3(0); 29 | 30 | vec3 color = mix(vec3(1, 1, 1), t, a * 0.7); 31 | 32 | if (isFood == 1) { 33 | color = vec3(1, 0.1, 0.1); 34 | } else if (isHome == 1) { 35 | color = vec3(0.1, 0.1, 1); 36 | } else if (isObstacle == 1) { 37 | color = vec3(0.6, 0.6, 0.6); 38 | } 39 | 40 | FragColor = vec4(color, 1); 41 | } -------------------------------------------------------------------------------- /src/shaders/screenWorld.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | varying vec2 vUv; 5 | 6 | void main() { 7 | vUv = uv; 8 | 9 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1); 10 | } -------------------------------------------------------------------------------- /src/shaders/world.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec2 vUv; 5 | 6 | out vec4 FragColor; 7 | 8 | uniform sampler2D tLastState; 9 | uniform sampler2D tDiscreteAnts; 10 | 11 | void main() { 12 | vec4 lastState = texture(tLastState, vUv); 13 | vec3 discreteAnts = texture(tDiscreteAnts, vUv).xyz; 14 | 15 | int cellData = int(lastState.x); 16 | int isFood = cellData & 1; 17 | int isHome = (cellData & 2) >> 1; 18 | int isObstacle = (cellData & 4) >> 2; 19 | float scentToHome = min(SCENT_MAX_PER_CELL, lastState.y + discreteAnts.x); 20 | float scentToFood = min(SCENT_MAX_PER_CELL, lastState.z + discreteAnts.y); 21 | 22 | if (discreteAnts.z == 1.) { 23 | isFood = 0; 24 | } 25 | 26 | FragColor = vec4(float(isFood + (isHome << 1) + (isObstacle << 2)), scentToHome, scentToFood, 0); 27 | } -------------------------------------------------------------------------------- /src/shaders/world.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec3 position; 5 | in vec2 uv; 6 | 7 | out vec2 vUv; 8 | 9 | void main() { 10 | vUv = uv; 11 | gl_Position = vec4(position, 1.0); 12 | } -------------------------------------------------------------------------------- /src/shaders/worldBlur.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec2 vUv; 5 | 6 | out vec4 FragColor; 7 | 8 | uniform sampler2D tWorld; 9 | 10 | const float offset = 1. / WORLD_SIZE * SCENT_BLUR_RADIUS; 11 | 12 | void main() { 13 | vec4 s0 = texture(tWorld, vUv); 14 | vec4 s1 = texture(tWorld, vUv + vec2(1, 1) * offset); 15 | vec4 s2 = texture(tWorld, vUv + vec2(-1, -1) * offset); 16 | vec4 s3 = texture(tWorld, vUv + vec2(-1, 1) * offset); 17 | vec4 s4 = texture(tWorld, vUv + vec2(1, -1) * offset); 18 | 19 | float scentToHome = (s0.y + s1.y + s2.y + s3.y + s4.y) / 5. * (1. - SCENT_FADE_OUT_FACTOR); 20 | float scentToFood = (s0.z + s1.z + s2.z + s3.z + s4.z) / 5. * (1. - SCENT_FADE_OUT_FACTOR); 21 | 22 | FragColor = vec4( 23 | s0.x, 24 | scentToHome < SCENT_THRESHOLD ? 0. : scentToHome, 25 | scentToFood < SCENT_THRESHOLD ? 0. : scentToFood, 26 | 0 27 | ); 28 | } -------------------------------------------------------------------------------- /src/shaders/worldBlur.vert: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | precision highp int; 3 | 4 | in vec3 position; 5 | in vec2 uv; 6 | 7 | out vec2 vUv; 8 | 9 | void main() { 10 | vUv = uv; 11 | gl_Position = vec4(position, 1.0); 12 | } -------------------------------------------------------------------------------- /src/textures/ant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StrandedKitty/ants-simulation/d7715f7da7b04c0d6dbf2238ca5175e50efad442/src/textures/ant.png -------------------------------------------------------------------------------- /src/textures/food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StrandedKitty/ants-simulation/d7715f7da7b04c0d6dbf2238ca5175e50efad442/src/textures/food.png -------------------------------------------------------------------------------- /src/utils/FullScreenTriangleGeometry.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | 3 | const positionBuffer = new Float32Array([ 4 | -1, 3, 0, 5 | -1, -1, 0, 6 | 3, -1, 0, 7 | ]); 8 | 9 | const uvBuffer = new Float32Array([ 10 | 0, 2, 11 | 0, 0, 12 | 2, 0 13 | ]); 14 | 15 | export default class FullScreenTriangleGeometry extends THREE.BufferGeometry { 16 | constructor() { 17 | super(); 18 | 19 | this.setAttribute( 20 | 'position', 21 | new THREE.BufferAttribute(positionBuffer, 3) 22 | ); 23 | this.setAttribute( 24 | 'uv', 25 | new THREE.BufferAttribute(uvBuffer, 2) 26 | ); 27 | } 28 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "es6", 4 | "target": "es6", 5 | "lib": [ 6 | "es2019", 7 | "dom" 8 | ], 9 | "allowJs": true, 10 | "sourceMap": true, 11 | "moduleResolution": "node", 12 | "alwaysStrict": true, 13 | "noImplicitAny": true, 14 | "noImplicitThis": true, 15 | "strictBindCallApply": true, 16 | "strictFunctionTypes": true, 17 | "resolveJsonModule": true, 18 | "allowSyntheticDefaultImports": true, 19 | }, 20 | "include": ["src"] 21 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const {CleanWebpackPlugin} = require('clean-webpack-plugin'); 3 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 4 | const CopyPlugin = require('copy-webpack-plugin'); 5 | 6 | module.exports = [{ 7 | entry: './src/App.ts', 8 | output: { 9 | filename: './js/main.js', 10 | path: path.resolve(__dirname, 'build') 11 | }, 12 | performance: { 13 | hints: false 14 | }, 15 | devtool: 'inline-source-map', 16 | plugins: [ 17 | new CleanWebpackPlugin(), 18 | new HtmlWebpackPlugin({ 19 | filename: 'index.html', 20 | template: './src/index.html', 21 | minify: false 22 | }), 23 | new CopyPlugin({ 24 | patterns: [ 25 | {from: './src/textures', to: path.resolve(__dirname, 'build/textures')} 26 | ] 27 | }), 28 | ], 29 | module: { 30 | rules: [ 31 | { 32 | test: /\.ts|.tsx$/, 33 | loader: 'ts-loader', 34 | options: {configFile: 'tsconfig.json'}, 35 | exclude: /node_modules/ 36 | }, { 37 | test: /\.(frag|vert)$/i, 38 | use: 'raw-loader' 39 | } 40 | ] 41 | }, 42 | resolve: { 43 | extensions: ['.ts', '.js'] 44 | } 45 | }]; 46 | --------------------------------------------------------------------------------