From 514aa8d108a805105613ea874c915b1403ba3ffa Mon Sep 17 00:00:00 2001 From: yxy5332upenn Date: Mon, 23 Sep 2024 21:37:55 -0400 Subject: [PATCH 1/3] finished --- package-lock.json | 2649 +++++++++++++++++++--------- package.json | 5 +- src/Camera.ts | 2 + src/geometry/Cube.ts | 120 ++ src/geometry/Icosphere.ts | 181 ++ src/geometry/Square.ts | 19 +- src/globals.ts | 2 + src/main.ts | 106 +- src/rendering/gl/Drawable.ts | 17 + src/rendering/gl/OpenGLRenderer.ts | 15 +- src/rendering/gl/ShaderProgram.ts | 86 +- src/shaders/fireball-frag.glsl | 81 + src/shaders/fireball-vert.glsl | 91 + src/shaders/flat-frag.glsl | 56 +- src/shaders/lambert-frag.glsl | 46 + src/shaders/lambert-vert.glsl | 55 + 16 files changed, 2600 insertions(+), 931 deletions(-) create mode 100644 src/geometry/Cube.ts create mode 100644 src/geometry/Icosphere.ts create mode 100644 src/shaders/fireball-frag.glsl create mode 100644 src/shaders/fireball-vert.glsl create mode 100644 src/shaders/lambert-frag.glsl create mode 100644 src/shaders/lambert-vert.glsl diff --git a/package-lock.json b/package-lock.json index e1a47a34..4d68d774 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,214 +1,223 @@ { + "name": "hw01-fireball", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "3d-view": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.1.tgz", - "integrity": "sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA==", - "requires": { - "matrix-camera-controller": "^2.1.1", - "orbit-camera-controller": "^4.0.0", - "turntable-camera-controller": "^3.0.0" - } - }, - "3d-view-controls": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", - "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", - "requires": { - "3d-view": "^2.0.0", - "has-passive-events": "^1.0.0", - "mouse-change": "^1.1.1", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.0.2", - "right-now": "^1.0.0" - } - }, - "@discoveryjs/json-ext": { + "packages": { + "": { + "dependencies": { + "3d-view-controls": "^2.2.2", + "dat.gui": "^0.7.9", + "gl-matrix": "^3.3.0", + "stats-js": "^1.0.1" + }, + "devDependencies": { + "@types/dat.gui": "^0.7.13", + "@types/webgl2": "0.0.6", + "ts-loader": "^9.2.5", + "typescript": "^4.4.2", + "webpack": "^5.52.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.1.1", + "webpack-glsl-loader": "^1.0.1" + } + }, + "node_modules/@discoveryjs/json-ext": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.0.0" + } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@types/dat.gui": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.7.tgz", - "integrity": "sha512-CxLCme0He5Jk3uQwfO/fGZMyNhb/ypANzqX0yU9lviBQMlen5SOvQTBQ/Cd9x5mFlUAK5Tk8RgvTyLj1nYkz+w==", - "dev": true + "node_modules/@types/dat.gui": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.13.tgz", + "integrity": "sha512-LmG4Pr0mbsB/1WVttf8xaHx45BvSBDGY5D9+0/9AZCbI4vvOguwBHZdKyJMxt5Yst8+icRSHKmr7ClV2u5ZtDA==", + "dev": true, + "license": "MIT" }, - "@types/eslint": { + "node_modules/@types/eslint": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "dev": true, - "requires": { + "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "@types/eslint-scope": { + "node_modules/@types/eslint-scope": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", "dev": true, - "requires": { + "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, - "@types/estree": { + "node_modules/@types/estree": { "version": "0.0.50", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, - "@types/http-proxy": { + "node_modules/@types/http-proxy": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/json-schema": { + "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, - "@types/node": { + "node_modules/@types/node": { "version": "9.6.61", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", "dev": true }, - "@types/retry": { + "node_modules/@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, - "@types/webgl2": { + "node_modules/@types/webgl2": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.6.tgz", "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==", "dev": true }, - "@webassemblyjs/ast": { + "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, - "@webassemblyjs/floating-point-hex-parser": { + "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, - "@webassemblyjs/helper-api-error": { + "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, - "@webassemblyjs/helper-buffer": { + "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-numbers": { + "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/helper-wasm-bytecode": { + "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, - "@webassemblyjs/helper-wasm-section": { + "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1" } }, - "@webassemblyjs/ieee754": { + "node_modules/@webassemblyjs/ieee754": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, - "requires": { + "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, - "@webassemblyjs/leb128": { + "node_modules/@webassemblyjs/leb128": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, - "requires": { + "dependencies": { "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/utf8": { + "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, - "@webassemblyjs/wasm-edit": { + "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -219,12 +228,12 @@ "@webassemblyjs/wast-printer": "1.11.1" } }, - "@webassemblyjs/wasm-gen": { + "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", "@webassemblyjs/ieee754": "1.11.1", @@ -232,24 +241,24 @@ "@webassemblyjs/utf8": "1.11.1" } }, - "@webassemblyjs/wasm-opt": { + "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", "@webassemblyjs/wasm-gen": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1" } }, - "@webassemblyjs/wasm-parser": { + "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -258,180 +267,267 @@ "@webassemblyjs/utf8": "1.11.1" } }, - "@webassemblyjs/wast-printer": { + "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, - "requires": { + "dependencies": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, - "@webpack-cli/configtest": { + "node_modules/@webpack-cli/configtest": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", - "dev": true + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } }, - "@webpack-cli/info": { + "node_modules/@webpack-cli/info": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", "dev": true, - "requires": { + "dependencies": { "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" } }, - "@webpack-cli/serve": { + "node_modules/@webpack-cli/serve": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", - "dev": true + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } }, - "@xtuc/ieee754": { + "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "@xtuc/long": { + "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "accepts": { + "node_modules/3d-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.1.tgz", + "integrity": "sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA==", + "dependencies": { + "matrix-camera-controller": "^2.1.1", + "orbit-camera-controller": "^4.0.0", + "turntable-camera-controller": "^3.0.0" + } + }, + "node_modules/3d-view-controls": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", + "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", + "dependencies": { + "3d-view": "^2.0.0", + "has-passive-events": "^1.0.0", + "mouse-change": "^1.1.1", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.0.2", + "right-now": "^1.0.0" + } + }, + "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, - "requires": { + "dependencies": { "mime-types": "~2.1.24", "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" } }, - "acorn": { + "node_modules/acorn": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-import-assertions": { + "node_modules/acorn-import-assertions": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", - "dev": true + "dev": true, + "peerDependencies": { + "acorn": "^8" + } }, - "aggregate-error": { + "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "requires": { + "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ajv-keywords": { + "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } }, - "ansi-html-community": { + "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz", "integrity": "sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "array-flatten": { + "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "async": { + "node_modules/async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.14" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "batch": { + "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "binary-search-bounds": { + "node_modules/binary-search-bounds": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" }, - "body-parser": { + "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, - "requires": { + "dependencies": { "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", @@ -443,21 +539,25 @@ "raw-body": "2.4.0", "type-is": "~1.6.17" }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "bonjour": { + "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, - "requires": { + "dependencies": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", "dns-equal": "^1.0.0", @@ -466,163 +566,212 @@ "multicast-dns-service-types": "^1.1.0" } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { + "node_modules/browserslist": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", "dev": true, - "requires": { + "dependencies": { "caniuse-lite": "^1.0.30001254", "colorette": "^1.3.0", "electron-to-chromium": "^1.3.830", "escalade": "^3.1.1", "node-releases": "^1.1.75" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { + "node_modules/buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "bytes": { + "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "call-bind": { + "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001255", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", - "dev": true + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, - "chalk": { + "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "chrome-trace-event": { + "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0" + } }, - "clean-stack": { + "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "clone-deep": { + "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "requires": { + "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "colorette": { + "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, - "commander": { + "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "compressible": { + "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "requires": { + "dependencies": { "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "compression": { + "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", @@ -631,142 +780,169 @@ "safe-buffer": "5.1.2", "vary": "~1.1.2" }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "engines": { + "node": ">= 0.8.0" } }, - "concat-map": { + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "connect-history-api-fallback": { + "node_modules/connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8" + } }, - "content-disposition": { + "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "5.1.2" }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cookie": { + "node_modules/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "cubic-hermite": { + "node_modules/cubic-hermite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" }, - "dat.gui": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.7.tgz", - "integrity": "sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw==" + "node_modules/dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==", + "license": "Apache-2.0" }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "deep-equal": { + "node_modules/deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dev": true, - "requires": { + "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", "is-regex": "^1.0.4", "object-is": "^1.0.1", "object-keys": "^1.1.1", "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "default-gateway": { + "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "requires": { + "dependencies": { "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" } }, - "define-lazy-prop": { + "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "define-properties": { + "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "requires": { + "dependencies": { "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "del": { + "node_modules/del": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, - "requires": { + "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", "is-glob": "^4.0.1", @@ -775,169 +951,212 @@ "p-map": "^4.0.0", "rimraf": "^3.0.2", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "depd": { + "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-node": { + "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "dns-equal": { + "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", "dev": true }, - "dns-packet": { + "node_modules/dns-packet": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, - "requires": { + "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" } }, - "dns-txt": { + "node_modules/dns-txt": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, - "requires": { + "dependencies": { "buffer-indexof": "^1.0.0" } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.3.832", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.832.tgz", "integrity": "sha512-x7lO8tGoW0CyV53qON4Lb5Rok9ipDelNdBIAiYUZ03dqy4u9vohMM1qV047+s/hiyJiqUWX/3PNwkX3kexX5ig==", "dev": true }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "enhanced-resolve": { + "node_modules/enhanced-resolve": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "envinfo": { + "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } }, - "es-module-lexer": { + "node_modules/es-module-lexer": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", "dev": true }, - "escalade": { + "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-html": { + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, - "eslint-scope": { + "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "requires": { + "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "eventemitter3": { + "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "events": { + "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.x" + } }, - "execa": { + "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -947,14 +1166,20 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "express": { + "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", @@ -986,94 +1211,104 @@ "utils-merge": "1.0.1", "vary": "~1.1.2" }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "engines": { + "node": ">= 0.10.0" } }, - "fast-deep-equal": { + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" } }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fastest-levenshtein": { + "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, - "fastq": { + "node_modules/fastq": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "faye-websocket": { + "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "requires": { + "dependencies": { "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "filtered-vector": { + "node_modules/filtered-vector": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.5.tgz", "integrity": "sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw==", - "requires": { + "dependencies": { "binary-search-bounds": "^2.0.0", "cubic-hermite": "^1.0.0" } }, - "finalhandler": { + "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -1081,648 +1316,858 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "follow-redirects": { + "node_modules/follow-redirects": { "version": "1.14.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "fs": { + "node_modules/fs": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", "dev": true }, - "fs-monkey": { + "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", "dev": true }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "get-intrinsic": { + "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "get-stream": { + "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "gl-mat3": { + "node_modules/gl-mat3": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" }, - "gl-mat4": { + "node_modules/gl-mat4": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" }, - "gl-matrix": { + "node_modules/gl-matrix": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" }, - "gl-quat": { + "node_modules/gl-quat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", - "requires": { + "dependencies": { "gl-mat3": "^1.0.0", "gl-vec3": "^1.0.3", "gl-vec4": "^1.0.0" } }, - "gl-vec3": { + "node_modules/gl-vec3": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" }, - "gl-vec4": { + "node_modules/gl-vec4": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" }, - "glob": { + "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "glob-to-regexp": { + "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "globby": { + "node_modules/globby": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "handle-thing": { + "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "has-passive-events": { + "node_modules/has-passive-events": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", - "requires": { + "dependencies": { "is-browser": "^2.0.1" } }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-tostringtag": { + "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, - "requires": { + "dependencies": { "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "hpack.js": { + "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" - }, + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "html-entities": { + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/html-entities": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", "dev": true }, - "http-deceiver": { + "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, - "http-errors": { + "node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, - "requires": { + "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "engines": { + "node": ">= 0.6" } }, - "http-parser-js": { + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", "dev": true }, - "http-proxy": { + "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "requires": { + "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "http-proxy-middleware": { + "node_modules/http-proxy-middleware": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", "dev": true, - "requires": { + "dependencies": { "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" } }, - "human-signals": { + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.17.0" + } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ignore": { + "node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "import-local": { + "node_modules/import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, - "requires": { + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" } }, - "indent-string": { + "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "internal-ip": { + "node_modules/internal-ip": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", "dev": true, - "requires": { + "dependencies": { "default-gateway": "^6.0.0", "ipaddr.js": "^1.9.1", "is-ip": "^3.1.0", "p-event": "^4.2.0" }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/internal-ip?sponsor=1" + } + }, + "node_modules/internal-ip/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" } }, - "interpret": { + "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "ip": { + "node_modules/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ip-regex": { + "node_modules/ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true + "dev": true, + "engines": { + "node": ">= 10" + } }, - "is-arguments": { + "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-browser": { + "node_modules/is-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dev": true, - "requires": { + "dependencies": { "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-date-object": { + "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "requires": { + "dependencies": { "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-docker": { + "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-ip": { + "node_modules/is-ip": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", "dev": true, - "requires": { + "dependencies": { "ip-regex": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-path-cwd": { + "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "is-path-inside": { + "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-plain-object": { + "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-regex": { + "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-wsl": { + "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "requires": { + "dependencies": { "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { + "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "jest-worker": { + "node_modules/jest-worker": { "version": "27.1.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "json-parse-better-errors": { + "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "kind-of": { + "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "loader-runner": { + "node_modules/loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.11.5" + } }, - "locate-path": { + "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lru-cache": { + "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "requires": { + "dependencies": { "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "map-age-cleaner": { + "node_modules/map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, - "requires": { + "dependencies": { "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "mat4-decompose": { + "node_modules/mat4-decompose": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", - "requires": { + "dependencies": { "gl-mat4": "^1.0.1", "gl-vec3": "^1.0.2" } }, - "mat4-interpolate": { + "node_modules/mat4-interpolate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", - "requires": { + "dependencies": { "gl-mat4": "^1.0.1", "gl-vec3": "^1.0.2", "mat4-decompose": "^1.0.3", @@ -1730,742 +2175,1006 @@ "quat-slerp": "^1.0.0" } }, - "mat4-recompose": { + "node_modules/mat4-recompose": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", - "requires": { + "dependencies": { "gl-mat4": "^1.0.1" } }, - "matrix-camera-controller": { + "node_modules/matrix-camera-controller": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz", "integrity": "sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA==", - "requires": { + "dependencies": { "binary-search-bounds": "^2.0.0", "gl-mat4": "^1.1.2", "gl-vec3": "^1.0.3", "mat4-interpolate": "^1.0.3" } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mem": { + "node_modules/mem": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", "dev": true, - "requires": { + "dependencies": { "map-age-cleaner": "^0.1.3", "mimic-fn": "^3.1.0" }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/mem/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "memfs": { + "node_modules/memfs": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.4.tgz", "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", "dev": true, - "requires": { + "dependencies": { "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.32", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "minimalistic-assert": { + "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { + "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "mouse-change": { + "node_modules/mouse-change": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", - "requires": { + "dependencies": { "mouse-event": "^1.0.0" } }, - "mouse-event": { + "node_modules/mouse-event": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" }, - "mouse-event-offset": { + "node_modules/mouse-event-offset": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" }, - "mouse-wheel": { + "node_modules/mouse-wheel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", - "requires": { + "dependencies": { "right-now": "^1.0.0", "signum": "^1.0.0", "to-px": "^1.0.1" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multicast-dns": { + "node_modules/multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, - "requires": { + "dependencies": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "multicast-dns-service-types": { + "node_modules/multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "neo-async": { + "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node-forge": { + "node_modules/node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6.0.0" + } }, - "node-releases": { + "node_modules/node-releases": { "version": "1.1.75", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "object-is": { + "node_modules/object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "obuf": { + "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "on-finished": { + "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "on-headers": { + "node_modules/on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "open": { + "node_modules/open": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, - "requires": { + "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "orbit-camera-controller": { + "node_modules/orbit-camera-controller": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", - "requires": { + "dependencies": { "filtered-vector": "^1.2.1", "gl-mat4": "^1.0.3" } }, - "p-defer": { + "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-event": { + "node_modules/p-event": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dev": true, - "requires": { + "dependencies": { "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-finally": { + "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { + "dependencies": { "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.2.0" }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } + "engines": { + "node": ">=8" } }, - "p-map": { + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, - "requires": { + "dependencies": { "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-retry": { + "node_modules/p-retry": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, - "requires": { + "dependencies": { "@types/retry": "^0.12.0", "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" } }, - "p-timeout": { + "node_modules/p-timeout": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, - "requires": { + "dependencies": { "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "parse-unit": { + "node_modules/parse-unit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "path": { + "node_modules/path": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=", "dev": true }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "portfinder": { + "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, - "requires": { + "dependencies": { "async": "^2.6.2", "debug": "^3.1.1", "mkdirp": "^0.5.5" }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } + "ms": "^2.1.1" } }, - "process-nextick-args": { + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" } }, - "punycode": { + "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "qs": { + "node_modules/qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "quat-slerp": { + "node_modules/quat-slerp": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", - "requires": { + "dependencies": { "gl-quat": "^1.0.0" } }, - "querystring": { + "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { + "node_modules/raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, - "requires": { + "dependencies": { "bytes": "3.1.0", "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "requires": { + "dependencies": { "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" } }, - "regexp.prototype.flags": { + "node_modules/regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "requires-port": { + "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "requires": { + "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "retry": { + "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "right-now": { + "node_modules/right-now": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "schema-utils": { + "node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "select-hose": { + "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selfsigned": { + "node_modules/selfsigned": { "version": "1.10.11", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dev": true, - "requires": { + "dependencies": { "node-forge": "^0.10.0" } }, - "semver": { + "node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "requires": { + "dependencies": { "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "send": { + "node_modules/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", "destroy": "~1.0.4", @@ -2480,30 +3189,31 @@ "range-parser": "~1.2.1", "statuses": "~1.5.0" }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } + "engines": { + "node": ">= 0.8.0" } }, - "serialize-javascript": { + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "requires": { + "dependencies": { "randombytes": "^2.1.0" } }, - "serve-index": { + "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", @@ -2512,426 +3222,545 @@ "mime-types": "~2.1.17", "parseurl": "~1.3.2" }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "serve-static": { + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "shallow-clone": { + "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "signum": { + "node_modules/signum": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "sockjs": { + "node_modules/sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "dev": true, - "requires": { + "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^3.4.0", "websocket-driver": "^0.7.4" } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "spdy": { + "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "spdy-transport": { + "node_modules/spdy-transport": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", "hpack.js": "^2.1.6", "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "stats-js": { + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/stats-js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stats-js/-/stats-js-1.0.1.tgz", - "integrity": "sha512-EAwEFghGNv8mlYC4CZzI5kWghsnP8uBKXw6VLRHtXkOk5xySfUKLTqTkjgJFfDluIkf/O7eZwi5MXP50VeTbUg==" + "integrity": "sha512-EAwEFghGNv8mlYC4CZzI5kWghsnP8uBKXw6VLRHtXkOk5xySfUKLTqTkjgJFfDluIkf/O7eZwi5MXP50VeTbUg==", + "license": "MIT" }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "string_decoder": { + "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "safe-buffer": "~5.1.0" } }, - "strip-ansi": { + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/strip-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^6.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "tapable": { + "node_modules/tapable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "terser": { + "node_modules/terser": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", "dev": true, - "requires": { + "dependencies": { "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.19" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "terser-webpack-plugin": { + "node_modules/terser-webpack-plugin": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", "dev": true, - "requires": { + "dependencies": { "jest-worker": "^27.0.6", "p-limit": "^3.1.0", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "thunky": { + "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "to-px": { + "node_modules/to-px": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", - "requires": { + "dependencies": { "parse-unit": "^1.0.1" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "ts-loader": { + "node_modules/ts-loader": { "version": "9.2.5", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" } }, - "turntable-camera-controller": { + "node_modules/turntable-camera-controller": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", - "requires": { + "dependencies": { "filtered-vector": "^1.2.1", "gl-mat4": "^1.0.2", "gl-vec3": "^1.0.2" } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typescript": { + "node_modules/typescript": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "url": { + "node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, - "requires": { + "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } } }, - "util-deprecate": { + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } }, - "v8-compile-cache": { + "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "watchpack": { + "node_modules/watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", "dev": true, - "requires": { + "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "wbuf": { + "node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "requires": { + "dependencies": { "minimalistic-assert": "^1.0.0" } }, - "webpack": { + "node_modules/webpack": { "version": "5.52.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", "dev": true, - "requires": { + "dependencies": { "@types/eslint-scope": "^3.7.0", "@types/estree": "^0.0.50", "@webassemblyjs/ast": "1.11.1", @@ -2956,14 +3785,29 @@ "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.2.0", "webpack-sources": "^3.2.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "webpack-cli": { + "node_modules/webpack-cli": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", "dev": true, - "requires": { + "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.0.4", "@webpack-cli/info": "^1.3.0", @@ -2978,35 +3822,69 @@ "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true } } }, - "webpack-dev-middleware": { + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", "dev": true, - "requires": { + "dependencies": { "colorette": "^1.2.2", "mem": "^8.1.1", "memfs": "^3.2.2", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "webpack-dev-server": { + "node_modules/webpack-dev-server": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.1.1.tgz", "integrity": "sha512-Kl1mnCEw8Cy1Kw173gCxLIB242LfPKEOj9WoKhKz/MbryZTNrILzOJTk8kiczw/YUEPzn3gcltCQv6hDsLudRg==", "dev": true, - "requires": { + "dependencies": { "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", "chokidar": "^3.5.1", @@ -3032,89 +3910,142 @@ "url": "^0.11.0", "webpack-dev-middleware": "^5.0.0", "ws": "^8.1.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "webpack-glsl-loader": { + "node_modules/webpack-glsl-loader": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz", "integrity": "sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=", "dev": true, - "requires": { + "dependencies": { "fs": "0.0.2", "path": "^0.11.14" } }, - "webpack-merge": { + "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, - "requires": { + "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "webpack-sources": { + "node_modules/webpack-sources": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.13.0" + } }, - "websocket-driver": { + "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "requires": { + "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "websocket-extensions": { + "node_modules/websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "wildcard": { + "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "ws": { + "node_modules/ws": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz", "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "yallist": { + "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index b7820dea..7b8bcdd5 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "build": "webpack" }, "devDependencies": { + "@types/dat.gui": "^0.7.13", "@types/webgl2": "0.0.6", "ts-loader": "^9.2.5", "typescript": "^4.4.2", @@ -14,6 +15,8 @@ }, "dependencies": { "3d-view-controls": "^2.2.2", - "gl-matrix": "^3.3.0" + "dat.gui": "^0.7.9", + "gl-matrix": "^3.3.0", + "stats-js": "^1.0.1" } } diff --git a/src/Camera.ts b/src/Camera.ts index 77a76105..57e3cce6 100644 --- a/src/Camera.ts +++ b/src/Camera.ts @@ -39,3 +39,5 @@ class Camera { }; export default Camera; + + diff --git a/src/geometry/Cube.ts b/src/geometry/Cube.ts new file mode 100644 index 00000000..f5b4348d --- /dev/null +++ b/src/geometry/Cube.ts @@ -0,0 +1,120 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Cube extends Drawable { + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + + this.indices = new Uint32Array([ + 0, 1, 2, + 0, 2, 3, + 4, 5, 6, + 4, 6, 7, + 8, 9, 10, + 8, 10, 11, + 12, 13, 14, + 12, 14, 15, + 16, 17, 18, + 16, 18, 19, + 20, 21, 22, + 20, 22, 23, + 24, 25, 26, + 24, 26, 27 + ]); + this.normals = new Float32Array([ + //Front + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + 0, 0, 1, + //Right + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + 1, 0, 0, + //Left + -1, 0, 0, + -1, 0, 0, + -1, 0, 0, + -1, 0, 0, + //Back + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, + 0, 0, -1, + //Top + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + 0, 1, 0, + //Bottom + 0, -1, 0, + 0, -1, 0, + 0, -1, 0, + 0, -1, 0 + ]); + this.positions = new Float32Array([ + //Front + 1.0, 1.0, 1.0, 1.0, + 1.0, 0.0, 1.0, 1.0, + 0.0, 0.0, 1.0, 1.0, + 0.0, 1.0, 1.0, 1.0, + //Right + 1.0, 1.0, 0.0, 1.0, + 1.0, 0.0, 0.0, 1.0, + 1.0, 0.0, 1.0, 1.0, + 1.0, 1.0, 1.0, 1.0, + //Left + 0.0, 1.0, 1.0, 1.0, + 0.0, 0.0, 1.0, 1.0, + 0.0, 0.0, 0.0, 1.0, + 0.0, 1.0, 0.0, 1.0, + //Back + 0.0, 1.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 1.0, + 1.0, 0.0, 0.0, 1.0, + 1.0, 1.0, 0.0, 1.0, + //Top + 1.0, 1.0, 0.0, 1.0, + 1.0, 1.0, 1.0, 1.0, + 0.0, 1.0, 1.0, 1.0, + 0.0, 1.0, 0.0, 1.0, + //Bottom + 1.0, 0.0, 1.0, 1.0, + 1.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 1.0, 1.0 + ]); + + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created cube`); + } +}; + +export default Cube; + + diff --git a/src/geometry/Icosphere.ts b/src/geometry/Icosphere.ts new file mode 100644 index 00000000..fd990c5c --- /dev/null +++ b/src/geometry/Icosphere.ts @@ -0,0 +1,181 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Icosphere extends Drawable { + buffer: ArrayBuffer; + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3, public radius: number, public subdivisions: number) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + const X = 0.525731112119133606; + const Z = 0.850650808352039932; + const N = 0; + + let maxIndexCount = 20 * Math.pow(4, this.subdivisions); + let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2; + + // Create buffers to back geometry data + // Index data will ping pong back and forth between buffer0 and buffer1 during creation + // All data will be in buffer0 at the end + const buffer0 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + ); + const buffer1 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + ); + const buffers = [buffer0, buffer1]; + let b = 0; + + const indexByteOffset = 0; + const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT; + const normalByteOffset = vertexByteOffset; + const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT; + + // Create 3-uint buffer views into the backing buffer to represent triangles + // The C++ analogy to this would be something like: + // triangles[i] = reinterpret_cast*>(&buffer[offset]); + let triangles: Array = new Array(20); + let nextTriangles: Array = new Array(); + for (let i = 0; i < 20; ++i) { + triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + } + + // Create 3-float buffer views into the backing buffer to represent positions + let vertices: Array = new Array(12); + for (let i = 0; i < 12; ++i) { + vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + } + + // Initialize normals for a 20-sided icosahedron + vertices[0].set([ -X,N,Z,0 ]); + vertices[1].set([ X,N,Z,0 ]); + vertices[2].set([ -X,N,-Z,0 ]); + vertices[3].set([ X,N,-Z,0 ]); + vertices[4].set([ N,Z,X,0 ]); + vertices[5].set([ N,Z,-X,0 ]); + vertices[6].set([ N,-Z,X,0 ]); + vertices[7].set([ N,-Z,-X,0 ]); + vertices[8].set([ Z,X,N,0 ]); + vertices[9].set([ -Z,X, N,0 ]); + vertices[10].set([ Z,-X,N,0 ]); + vertices[11].set([ -Z,-X,N,0 ]); + + // Initialize indices for a 20-sided icosahedron + triangles[0].set([ 0,4,1 ]); + triangles[1].set([ 0,9,4 ]); + triangles[2].set([ 9,5,4 ]); + triangles[3].set([ 4,5,8 ]); + triangles[4].set([ 4,8,1 ]); + triangles[5].set([ 8,10,1 ]); + triangles[6].set([ 8,3,10 ]); + triangles[7].set([ 5,3,8 ]); + triangles[8].set([ 5,2,3 ]); + triangles[9].set([ 2,7,3 ]); + triangles[10].set([ 7,10,3 ]); + triangles[11].set([ 7,6,10 ]); + triangles[12].set([ 7,11,6 ]); + triangles[13].set([ 11,0,6 ]); + triangles[14].set([ 0,1,6 ],); + triangles[15].set([ 6,1,10 ]); + triangles[16].set([ 9,0,11 ]); + triangles[17].set([ 9,11,2 ]); + triangles[18].set([ 9,2,5 ]); + triangles[19].set([ 7,2,11 ]); + + // This loop subdivides the icosahedron + for (let s = 0; s < this.subdivisions; ++s) { + b = 1 - b; + nextTriangles.length = triangles.length * 4; + let triangleIdx = 0; + + // edgeMap maps a pair of vertex indices to a vertex index at their midpoint + // The function `mid` will get that midpoint vertex if it has already been created + // or it will create the vertex and add it to the map + let edgeMap: Map = new Map(); + function mid(v0: number, v1: number): number { + let key = [v0, v1].sort().join('_'); + if (!edgeMap.has(key)) { + let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.add(midpoint, vertices[v0], vertices[v1]); + vec4.normalize(midpoint, midpoint); + edgeMap.set(key, vertices.length); + vertices.push(midpoint); + } + return edgeMap.get(key); + } + + for (let t = 0; t < triangles.length; ++t) { + let v0 = triangles[t][0]; + let v1 = triangles[t][1]; + let v2 = triangles[t][2]; + let v3 = mid(v0, v1); // Get or create a vertex between these two vertices + let v4 = mid(v1, v2); + let v5 = mid(v2, v0); + + let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + + let triangleOffset = nextTriangles.length; + t0.set([v0, v3, v5]); + t1.set([v3, v4, v5]); + t2.set([v3, v1, v4]); + t3.set([v5, v4, v2]); + } + + // swap buffers + let temp = triangles; + triangles = nextTriangles; + nextTriangles = temp; + } + + if (b === 1) { + // if indices did not end up in buffer0, copy them there now + let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length); + let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length); + temp0.set(temp1); + } + + // Populate one position for each normal + for (let i = 0; i < vertices.length; ++i) { + let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius); + } + + this.buffer = buffer0; + this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3); + this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4); + this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created icosphere with ${vertices.length} vertices`); + } +}; + +export default Icosphere; + + diff --git a/src/geometry/Square.ts b/src/geometry/Square.ts index f2ee9471..2ce90404 100644 --- a/src/geometry/Square.ts +++ b/src/geometry/Square.ts @@ -5,6 +5,7 @@ import {gl} from '../globals'; class Square extends Drawable { indices: Uint32Array; positions: Float32Array; + normals: Float32Array; center: vec4; constructor(center: vec3) { @@ -16,18 +17,26 @@ class Square extends Drawable { this.indices = new Uint32Array([0, 1, 2, 0, 2, 3]); - this.positions = new Float32Array([-1, -1, 0.999, 1, - 1, -1, 0.999, 1, - 1, 1, 0.999, 1, - -1, 1, 0.999, 1]); + this.normals = new Float32Array([0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0]); + this.positions = new Float32Array([-1, -1, 0, 1, + 1, -1, 0, 1, + 1, 1, 0, 1, + -1, 1, 0, 1]); this.generateIdx(); this.generatePos(); + this.generateNor(); this.count = this.indices.length; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); @@ -36,3 +45,5 @@ class Square extends Drawable { }; export default Square; + + diff --git a/src/globals.ts b/src/globals.ts index cac5bf28..0fc097d2 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -3,3 +3,5 @@ export var gl: WebGL2RenderingContext; export function setGL(_gl: WebGL2RenderingContext) { gl = _gl; } + + diff --git a/src/main.ts b/src/main.ts index fe526f99..09d64ad8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,9 @@ -import {vec2, vec3} from 'gl-matrix'; -// import * as Stats from 'stats-js'; -// import * as DAT from 'dat-gui'; +import {vec3,vec4} from 'gl-matrix'; +const Stats = require('stats-js'); +import * as DAT from 'dat.gui'; +import Icosphere from './geometry/Icosphere'; import Square from './geometry/Square'; +import Cube from './geometry/Cube'; import OpenGLRenderer from './rendering/gl/OpenGLRenderer'; import Camera from './Camera'; import {setGL} from './globals'; @@ -12,41 +14,44 @@ import ShaderProgram, {Shader} from './rendering/gl/ShaderProgram'; const controls = { tesselations: 5, 'Load Scene': loadScene, // A function pointer, essentially + ColorChanged:[0,0,0,1], + fbmamplitude:0.5, + fbmfrequency:1.0, }; +let icosphere: Icosphere; let square: Square; -let time: number = 0; +let cube: Cube; +let prevTesselations: number = 5; +let Color:vec4; function loadScene() { + icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations); + icosphere.create(); square = new Square(vec3.fromValues(0, 0, 0)); square.create(); - // time = 0; + cube = new Cube(vec3.fromValues(0, 0, 0)); + cube.create(); } function main() { - window.addEventListener('keypress', function (e) { - // console.log(e.key); - switch(e.key) { - // Use this if you wish - } - }, false); - - window.addEventListener('keyup', function (e) { - switch(e.key) { - // Use this if you wish - } - }, false); - // Initial display for framerate - // const stats = Stats(); - // stats.setMode(0); - // stats.domElement.style.position = 'absolute'; - // stats.domElement.style.left = '0px'; - // stats.domElement.style.top = '0px'; - // document.body.appendChild(stats.domElement); + const stats = Stats(); + stats.setMode(0); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); // Add controls to the gui - // const gui = new DAT.GUI(); + const gui = new DAT.GUI(); + gui.add(controls, 'tesselations', 0, 8).step(1); + gui.add(controls, 'Load Scene'); + gui.add(controls,'fbmamplitude',0.1,1.2).step(0.1); + gui.add(controls,'fbmfrequency',0.1,1.2).step(0.1); + gui.addColor(controls,"ColorChanged").name("color").onChange((value)=>{ + Color = vec4.fromValues(value[0]/255.0,value[1]/255.0,value[2]/255.0,1); + }); // get canvas and webgl context const canvas = document.getElementById('canvas'); @@ -60,34 +65,59 @@ function main() { // Initial call to load scene loadScene(); + Color=vec4.fromValues(0,0,0,1); - const camera = new Camera(vec3.fromValues(0, 0, -10), vec3.fromValues(0, 0, 0)); + const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0)); const renderer = new OpenGLRenderer(canvas); - renderer.setClearColor(164.0 / 255.0, 233.0 / 255.0, 1.0, 1); + renderer.setClearColor(0.2, 0.2, 0.2, 1); gl.enable(gl.DEPTH_TEST); + /*const lambert = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')), + ]);*/ + const fire = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/fireball-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/fireball-frag.glsl')), + ]); + const flat = new ShaderProgram([ new Shader(gl.VERTEX_SHADER, require('./shaders/flat-vert.glsl')), new Shader(gl.FRAGMENT_SHADER, require('./shaders/flat-frag.glsl')), ]); - function processKeyPresses() { - // Use this if you wish - } - + // This function will be called every frame function tick() { camera.update(); - // stats.begin(); + stats.begin(); gl.viewport(0, 0, window.innerWidth, window.innerHeight); renderer.clear(); - processKeyPresses(); + if(controls.tesselations != prevTesselations) + { + prevTesselations = controls.tesselations; + icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations); + icosphere.create(); + } + //lambert.setGeometryColor(Color); + fire.setGeometryColor(Color); + let time = Date.now()%2000000/1000.0; + fire.setTime(time); + fire.setamplitude(controls.fbmamplitude); + fire.setfrequency(controls.fbmfrequency); + renderer.render(camera, flat, [ square, - ], time); - time++; - // stats.end(); + ]); + gl.clear(gl.DEPTH_BUFFER_BIT); + renderer.render(camera, fire, [ + //cube, + icosphere, + //square, + ]); + + stats.end(); // Tell the browser to call `tick` again whenever it renders a new frame requestAnimationFrame(tick); @@ -97,16 +127,16 @@ function main() { renderer.setSize(window.innerWidth, window.innerHeight); camera.setAspectRatio(window.innerWidth / window.innerHeight); camera.updateProjectionMatrix(); - flat.setDimensions(window.innerWidth, window.innerHeight); }, false); renderer.setSize(window.innerWidth, window.innerHeight); camera.setAspectRatio(window.innerWidth / window.innerHeight); camera.updateProjectionMatrix(); - flat.setDimensions(window.innerWidth, window.innerHeight); // Start the render loop tick(); } main(); + + diff --git a/src/rendering/gl/Drawable.ts b/src/rendering/gl/Drawable.ts index d658d6fa..033d8788 100644 --- a/src/rendering/gl/Drawable.ts +++ b/src/rendering/gl/Drawable.ts @@ -5,15 +5,18 @@ abstract class Drawable { bufIdx: WebGLBuffer; bufPos: WebGLBuffer; + bufNor: WebGLBuffer; idxBound: boolean = false; posBound: boolean = false; + norBound: boolean = false; abstract create() : void; destory() { gl.deleteBuffer(this.bufIdx); gl.deleteBuffer(this.bufPos); + gl.deleteBuffer(this.bufNor); } generateIdx() { @@ -26,6 +29,11 @@ abstract class Drawable { this.bufPos = gl.createBuffer(); } + generateNor() { + this.norBound = true; + this.bufNor = gl.createBuffer(); + } + bindIdx(): boolean { if (this.idxBound) { gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); @@ -40,6 +48,13 @@ abstract class Drawable { return this.posBound; } + bindNor(): boolean { + if (this.norBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + } + return this.norBound; + } + elemCount(): number { return this.count; } @@ -50,3 +65,5 @@ abstract class Drawable { }; export default Drawable; + + diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts index 10b91c61..3c220d76 100644 --- a/src/rendering/gl/OpenGLRenderer.ts +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -22,9 +22,16 @@ class OpenGLRenderer { gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); } - render(camera: Camera, prog: ShaderProgram, drawables: Array, time: number) { - prog.setEyeRefUp(camera.controls.eye, camera.controls.center, camera.controls.up); - prog.setTime(time); + render(camera: Camera, prog: ShaderProgram, drawables: Array) { + let model = mat4.create(); + let viewProj = mat4.create(); + //let color = vec4.fromValues(1, 0, 0, 1); + + mat4.identity(model); + mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + //prog.setGeometryColor(color); for (let drawable of drawables) { prog.draw(drawable); @@ -33,3 +40,5 @@ class OpenGLRenderer { }; export default OpenGLRenderer; + + diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts index d1ef5be5..9722fd9f 100644 --- a/src/rendering/gl/ShaderProgram.ts +++ b/src/rendering/gl/ShaderProgram.ts @@ -1,4 +1,4 @@ -import {vec2, vec3, vec4, mat4} from 'gl-matrix'; +import {vec4, mat4} from 'gl-matrix'; import Drawable from './Drawable'; import {gl} from '../../globals'; @@ -23,13 +23,15 @@ class ShaderProgram { attrPos: number; attrNor: number; + attrCol: number; - unifRef: WebGLUniformLocation; - unifEye: WebGLUniformLocation; - unifUp: WebGLUniformLocation; - unifDimensions: WebGLUniformLocation; + unifModel: WebGLUniformLocation; + unifModelInvTr: WebGLUniformLocation; + unifViewProj: WebGLUniformLocation; + unifColor: WebGLUniformLocation; unifTime: WebGLUniformLocation; - + uniffbmamplitude:WebGLUniformLocation; + uniffbmfrequency:WebGLUniformLocation; constructor(shaders: Array) { this.prog = gl.createProgram(); @@ -42,11 +44,15 @@ class ShaderProgram { } this.attrPos = gl.getAttribLocation(this.prog, "vs_Pos"); - this.unifEye = gl.getUniformLocation(this.prog, "u_Eye"); - this.unifRef = gl.getUniformLocation(this.prog, "u_Ref"); - this.unifUp = gl.getUniformLocation(this.prog, "u_Up"); - this.unifDimensions = gl.getUniformLocation(this.prog, "u_Dimensions"); - this.unifTime = gl.getUniformLocation(this.prog, "u_Time"); + this.attrNor = gl.getAttribLocation(this.prog, "vs_Nor"); + this.attrCol = gl.getAttribLocation(this.prog, "vs_Col"); + this.unifModel = gl.getUniformLocation(this.prog, "u_Model"); + this.unifModelInvTr = gl.getUniformLocation(this.prog, "u_ModelInvTr"); + this.unifViewProj = gl.getUniformLocation(this.prog, "u_ViewProj"); + this.unifColor = gl.getUniformLocation(this.prog, "u_Color"); + this.unifTime = gl.getUniformLocation(this.prog, "u_time"); + this.uniffbmamplitude=gl.getUniformLocation(this.prog,"fbmamplitude"); + this.uniffbmfrequency=gl.getUniformLocation(this.prog,"fbmfrequency"); } use() { @@ -56,30 +62,52 @@ class ShaderProgram { } } - setEyeRefUp(eye: vec3, ref: vec3, up: vec3) { + setModelMatrix(model: mat4) { this.use(); - if(this.unifEye !== -1) { - gl.uniform3f(this.unifEye, eye[0], eye[1], eye[2]); - } - if(this.unifRef !== -1) { - gl.uniform3f(this.unifRef, ref[0], ref[1], ref[2]); + if (this.unifModel !== -1) { + gl.uniformMatrix4fv(this.unifModel, false, model); } - if(this.unifUp !== -1) { - gl.uniform3f(this.unifUp, up[0], up[1], up[2]); + + if (this.unifModelInvTr !== -1) { + let modelinvtr: mat4 = mat4.create(); + mat4.transpose(modelinvtr, model); + mat4.invert(modelinvtr, modelinvtr); + gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); } } - setDimensions(width: number, height: number) { + setViewProjMatrix(vp: mat4) { this.use(); - if(this.unifDimensions !== -1) { - gl.uniform2f(this.unifDimensions, width, height); + if (this.unifViewProj !== -1) { + gl.uniformMatrix4fv(this.unifViewProj, false, vp); } } - setTime(t: number) { + setGeometryColor(color: vec4) { this.use(); - if(this.unifTime !== -1) { - gl.uniform1f(this.unifTime, t); + if (this.unifColor !== -1) { + gl.uniform4fv(this.unifColor, color); + } + } + + setTime(time: number) { + if (this.unifTime !== null) { + gl.useProgram(this.prog); + gl.uniform1f(this.unifTime, time); // Update u_time in shader + } + } + + setamplitude(ampli: number) { + if (this.uniffbmamplitude !== null) { + gl.useProgram(this.prog); + gl.uniform1f(this.uniffbmamplitude,ampli); // Update u_time in shader + } + } + + setfrequency(freq: number) { + if (this.uniffbmfrequency !== null) { + gl.useProgram(this.prog); + gl.uniform1f(this.uniffbmfrequency, freq); // Update u_time in shader } } @@ -91,11 +119,19 @@ class ShaderProgram { gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0); } + if (this.attrNor != -1 && d.bindNor()) { + gl.enableVertexAttribArray(this.attrNor); + gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0); + } + d.bindIdx(); gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0); if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos); + if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor); } }; export default ShaderProgram; + + diff --git a/src/shaders/fireball-frag.glsl b/src/shaders/fireball-frag.glsl new file mode 100644 index 00000000..ea520637 --- /dev/null +++ b/src/shaders/fireball-frag.glsl @@ -0,0 +1,81 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. +uniform float u_time; +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; +in vec4 fs_Pos; +in float wavet; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +vec3 random3(vec3 p) { + // A new method for generating pseudo-random values + return fract(sin(vec3( + dot(p, vec3(12.9898, 78.233, 45.164)), + dot(p, vec3(93.989, 67.345, 33.271)), + dot(p, vec3(39.346, 84.765, 27.345)) + )) * 43758.5453123); +} + +// Impulse +float impulse(float x, float k) { + float h = k * x; + return h * exp(1.0 - h); +} + +float sawtooth_wave(float x, float freq, float amplitude){ + return (x*freq-floor(x*freq))*amplitude; +} +// 3D Worley Noise function +float WorleyNoise(vec3 uv) { + uv *= 3.0; // The space is scaled to 3x3 instead of 1x1. + vec3 uvInt = floor(uv); + vec3 uvFract = fract(uv); + float minDist = 100.0; // Initialize minimum distance to a large value. + + // Iterate over the neighboring cells to find the closest feature point + for(int z = -1; z <= 1; ++z){ + for(int y = -1; y <= 1; ++y) { + for(int x = -1; x <= 1; ++x) { + vec3 neighbor = vec3(float(x), float(y), float(z)); // Neighboring cell + vec3 point = random3(uvInt + neighbor); // Random point within the neighboring cell + vec3 diff = neighbor + point - uvFract; // Vector between fragment and the point + float dist = length(diff); // Euclidean distance + minDist = min(minDist, dist); // Store the smallest distance + } + } + } + + return minDist; // Return the minimum distance to the closest point +} + +void main() +{ + // Calculate the Worley noise value without any smoothstep or time-related modifications + float worleyTerm = WorleyNoise(fs_Pos.xyz+vec3(u_time/2.0)); + + vec3 fireballColor = mix(vec3(1.0, 0.5, 0.0), vec3(1.0, 1.0, 0.0), worleyTerm); + // Modify the base color with Worley noise + vec3 color = fireballColor * u_Color.xyz; + + // Set final output color + out_Col = vec4(color, u_Color.a); +} + + diff --git a/src/shaders/fireball-vert.glsl b/src/shaders/fireball-vert.glsl new file mode 100644 index 00000000..7507bca2 --- /dev/null +++ b/src/shaders/fireball-vert.glsl @@ -0,0 +1,91 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself +uniform float u_time; +uniform float fbmamplitude; +uniform float fbmfrequency; +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Pos; +//out float wavet; +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +float sinfunction(vec4 p){ + return sin(vs_Pos.y * 2.0 + u_time * 2.0); +} + +float fBM(vec4 p) { + float amplitude = fbmamplitude; + float frequency = fbmfrequency; + float persistence = 0.5; + int octaves = 5; + + float total = 0.0; + + + for (int i = 0; i < octaves; i++) { + total += sinfunction(p * frequency) * amplitude; + frequency *= 2.0; + amplitude *= persistence; + } + + return total; +} + +float sawtooth_wave(float x, float freq, float amplitude){ + return (x*freq-floor(x*freq))*amplitude; +} + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + float wave = fBM(vs_Pos); // Wave effect along the Y-axis + //wavet=wave; + // Modify the X and Z coordinates with a sine wave. + vec4 modifiedPos = vs_Pos; + modifiedPos.x += wave * 0.1*sawtooth_wave(wave,1.0,1.0); // Amplitude of the wave is 0.3 on X-axis + modifiedPos.z += wave * 0.1; // Amplitude of the wave is 0.3 on Z-axis + modifiedPos.y += wave * 0.1; + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * modifiedPos; // Temporarily store the transformed vertex positions for use below + fs_Pos = modelposition; + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} + + diff --git a/src/shaders/flat-frag.glsl b/src/shaders/flat-frag.glsl index 50434bd8..02cadde0 100644 --- a/src/shaders/flat-frag.glsl +++ b/src/shaders/flat-frag.glsl @@ -8,6 +8,60 @@ uniform float u_Time; in vec2 fs_Pos; out vec4 out_Col; + +vec3 fade(vec3 t) { + return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); +} + +float grad(int hash, vec3 p) { + int h = hash & 15; + float u = h < 8 ? p.x : p.y; + float v = h < 4 ? p.y : (h == 12 || h == 14 ? p.x : p.z); + return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); +} + +float perlinNoise3D(vec3 p) { + vec3 Pi = floor(p); + vec3 Pf = p - Pi; + Pi = mod(Pi, 289.0); + vec3 fadePf = fade(Pf); + + float n000 = grad(int(dot(Pi, vec3(1.0, 57.0, 113.0))), Pf); + float n001 = grad(int(dot(Pi + vec3(0.0, 0.0, 1.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(0.0, 0.0, 1.0)); + float n010 = grad(int(dot(Pi + vec3(0.0, 1.0, 0.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(0.0, 1.0, 0.0)); + float n011 = grad(int(dot(Pi + vec3(0.0, 1.0, 1.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(0.0, 1.0, 1.0)); + float n100 = grad(int(dot(Pi + vec3(1.0, 0.0, 0.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(1.0, 0.0, 0.0)); + float n101 = grad(int(dot(Pi + vec3(1.0, 0.0, 1.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(1.0, 0.0, 1.0)); + float n110 = grad(int(dot(Pi + vec3(1.0, 1.0, 0.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(1.0, 1.0, 0.0)); + float n111 = grad(int(dot(Pi + vec3(1.0, 1.0, 1.0), vec3(1.0, 57.0, 113.0))), Pf - vec3(1.0, 1.0, 1.0)); + + vec3 blend = fadePf; + return mix(mix(mix(n000, n100, blend.x), mix(n010, n110, blend.x), blend.y), + mix(mix(n001, n101, blend.x), mix(n011, n111, blend.x), blend.y), + blend.z); +} + + +float fbm3DPerlin(float x, float y, float z) { + float total = 0.0; + float persistence = 0.6; + int octaves = 8; + float freq = 1.0; + float amp = 0.5; + for(int i = 0; i < octaves; i++) { + total += perlinNoise3D(vec3(x, y, z) * freq) * amp; + freq *= 2.0; + amp *= persistence; + } + return total; +} + + void main() { - out_Col = vec4(0.5 * (fs_Pos + vec2(1.0)), 0.5 * (sin(u_Time * 3.14159 * 0.01) + 1.0), 1.0); + float noise = fbm3DPerlin(fs_Pos.x, fs_Pos.y, u_Time * 0.1); + if (noise > 0.3) { + out_Col = vec4(1.0, 1.0, 1.0, 1.0); + } else { + out_Col = vec4(0.0, 0.0, 0.0, 1.0); + } } diff --git a/src/shaders/lambert-frag.glsl b/src/shaders/lambert-frag.glsl new file mode 100644 index 00000000..31e8c1b5 --- /dev/null +++ b/src/shaders/lambert-frag.glsl @@ -0,0 +1,46 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + // diffuseTerm = clamp(diffuseTerm, 0, 1); + + float ambientTerm = 0.2; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + + // Compute final shaded color + out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); +} + + diff --git a/src/shaders/lambert-vert.glsl b/src/shaders/lambert-vert.glsl new file mode 100644 index 00000000..048d6c40 --- /dev/null +++ b/src/shaders/lambert-vert.glsl @@ -0,0 +1,55 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} + + From 5bf33a746f7bf070666d516b0bb7a7a9a56521a7 Mon Sep 17 00:00:00 2001 From: yxy5332upenn Date: Mon, 23 Sep 2024 21:46:11 -0400 Subject: [PATCH 2/3] changed --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 09d64ad8..49b17b3a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -88,7 +88,7 @@ function main() { ]); - // This function will be called every frame + // This function will be called every fram function tick() { camera.update(); stats.begin(); From c71e900a24388621d02612c316552f5cb5261a09 Mon Sep 17 00:00:00 2001 From: yxy5332upenn Date: Mon, 23 Sep 2024 21:57:25 -0400 Subject: [PATCH 3/3] done --- README.md | 6 ++++++ yangyu1.png | Bin 0 -> 156440 bytes 2 files changed, 6 insertions(+) create mode 100644 yangyu1.png diff --git a/README.md b/README.md index 1a7646c7..3e20ae9f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # [Project 1: Noise](https://github.com/CIS-566-Fall-2022/hw01-fireball-base) + +1.used sin,fbm and swatooth wave to change the sphere shape +2.used worley noise to change the color of the ball +3.added background +![image](yangyu1.png) +live demo: https://yxy5332upenn.github.io/hw01-fireball/ ## Objective Get comfortable with using WebGL and its shaders to generate an interesting 3D, continuous surface using a multi-octave noise algorithm. diff --git a/yangyu1.png b/yangyu1.png new file mode 100644 index 0000000000000000000000000000000000000000..660d86f058265d28180bd33b91b2690c32147f1c GIT binary patch literal 156440 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¨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⁢n4nBFna)LkF{DpHO2xnPR+G+VMSN@a+8HuUtHYIwN6fHe z`gd%uw^Y71#~kzAZNWU5sbA_l+)84T1DhhGs7XaUi>ou6o8KH>K+mtrC!f`u;jM@C zc|n$@jogC>uV_M~D`>93z&af?_%8ik9jrkKn9C8E1f`84u}ojwzrdNK zdT$kU;2vQ{Z0J)YIW2v}R@Npb{0OwwkAM16ub~!!f>`%?C~pWj#4?o`V zN0a%xTF;n1%2`54cxffiNKjV?#gX+cGOg}E1r7c{^CI`$hVO?j->#VK0ezDaAj>zO zyAhc1n~3$R*L5w=*jLbG6N3mrc=g6dVQz_TVg3{aHX)B7!h7R85Fag8vqXo$7M}5a zOQkcPSm&X%*>FoX;xXbXvCb@{2{Y-3B}AT$RE9;sa%u%{3)Ig^&K7I++p5+}>i*>< zw_DSsoCNeBHZ3NK{`iNNDE(z1qw!Nxd%QL!e%pVbu+vO7-x7H!im+e)1?q6a7MSyQnPU!Rf$#8Q@TSq$S6wS>MFoBq%nWX`Fl5h3TDX0(Fw7Hk z6f%K|^NP-*id)?Pyl(T5_v=ti%=jo}C|=@|8d4qCntde+sMg$4S9)UdF(W|oR^*o| zC6TT|?=W1fFg`zB8p;!7%Us83+M+slj<2NGn>&1M&XaR}DLq^v7(v#yn#u##3dqV1 zkgWe;&z$>(+wdAGw4adF^*cr+-~a3F)*DC6H$Bs8`)iT2!jEC5^{)8!eA$9BkJ2dv zxz~}gTd!QM!yskCCRo&-azEyLF?H2imwPQ5sn}6HNrlR5*H`X$iHh0-MmcqP`i+S9 z*c&z76sQE3io;k}sDTc!G2mUM!yhxpaYFfZK^MqO zgOG(8*k){#H^wgaq+vrLknv)Fx zXLc*}thvqHikO|h%wB05ZGSLJeH(q5ya0&9_KF8ku-HwCjE%5-J1hKJS2jrSLDqq+ z{W-MJ{zb>Cu$#L`A{AyMBHcd^oC-Fb8lAP(3^KpfcxV$h+a%TDmVLQBxK`8y;fS~DhoneV+L;`|-=w_w!Hr)G$TDmF07EbTj++ap=M@=jc;)R*zu zF%WufhIvx4GTny}^fdW(WfUnpvINcy1@hP_??b(L)x~Nji)xx{_&g)15%aQYhiw24 z!|T}?z+ud~@-X2hF}!or2Sh$GqR6Mn0KX7Ru&r$fo>}9=+rwgDzG5dV=pM~qM(aMv z5~@W7u^g}gOgY7AM?@6_%+Zm(U`8=GoS60_+q(42NqpnlPhCdD=I+*hYkb3FMRm}& zmn+q;<4-D53iTIR=(JcTK5a|hP0>Kr4nMpCR;#b6@%s~IQ@a^pXvSu1_NEq%Vs6Dd z5w5TJ_e@0W%ZJkDn-FQJ0&^hxEYiLg?nC9okt6U;IY^%VS58G+PSm>3C4tFfm;GRkX2xAWUY!HN{9HNJ09g0v#*No%krn9-2)O^6aws)*R^ z-s)y$N=!2|X!48It3^~_f|w`9U3b+3DAAlrk2(yLJ?x zf*)AgzSBR;5ONFef`O;i-qV+(a`isoakTZQEQrjZOLH z?tJ@9+j^)~hF}E_p>v?hRx-PHDNh_k*hmt&3nfVLJ;}S8C!&7DM0s{RA^Tm;&6DG@ zgmQ^LcE8n;$pM?=Pb=m+cmeg1YK6~-x?vx_wxD3cxN|E8r6T#9f}3l- z^{DlO{e)+&BX&kZx>$Jz;wd=xrVd<-6b=QH7DdG7XETobui(8aN}eoEmVP9Gtxx6S zx~EN%JC_%9Of+L`h+jinBTH+sTX65px+ZJcVXeVKqC4!%P;9d(lt9jf^7%P}3f30G#HwHz@NnZF`F4*na*=W@Sk_K= zP8*L|{oVV=KK|MAq*&M~MzzNWw3%COc$+WOz0kaTfu)SNQSbe=&4G6`j)%g^wdp~y z46S2Vwk^|w#Zd@YS(q$dmNI}SKpHU*Ti<i)*b$5dw9-bmj*=zbzgmo#}x_`;d=J z78m{F{rfA=FIkltkSKZ-BQEE}jvD}JkyPVEPK_ACv|=ZE-pGtO7ZiFu zi(%6RJb`Tjlv+=A!dK4m@pC5mt;$~Ic(9_Kj&l~*{Xp4MEPfUaeVf-(C9nNq+`W5+ z`!6{dXdPN9KwJ-ncLuF!cic8jKDOpM*yhqu`wy&o@l*KNZ0@zfwVb^1@+FTpkkYw@ z?;}1UdP79ANT4ApcRO|yjp4-_HntpuJB zN0xGn!~wJ-tZP6MD~^xF$+)yE=v&A)>aoO4?02GB1Wpmu%rUq0@&EV*l(?VfEyz#fC#VYq5%Sb=S*rtEU zXZ<6S|GE|*hpV1c^IiZP2qherlkTCtf1h2(90k77zli8I8D~c5Ko0uF+93^y*(KnO z`}F3O^38(PJh`UMzDm@e3P9vs7^?$y#0pq_4z?jEQ>HsJwn+VXb62C^5FE=2`z@$% zcMaj7z|9x^MKo@fVup<`suA!w==ykNjovL1d;S~u&`@H4qG8&;WLXRBvCH5`>;)l4 zah(uv!VgTAWAJh#recmWMYYB&4?@auGL1%8utD3_`ukg-2>m(sqGZ@9o|^Vu1|3NN z5qlYS*`9!(q`wt>Nj?K-SYL^_{ps>HNTJ)Au71uG3@2loU>{g_aj1fn#~>hOAn_5pc$q3(;BOs?ai3XA#Dbe{^mIdf9{4eg^ojq(xw%>vp%}C=|+Z@sbNtfS!qCSgb z%bpC&hWOIS@`E(-pja?smkqT@zT9b;qgDZV4%}Iw_%~oL7fz5X0!L&j-R!&meve;`ymG#`nf22{r*o=q++HZn1GX6R6r%LIr`V?5W4lFL7 zQ20jNKO53R5=7U;*e8$Y1{+2{jWcOPOXj8}$xJ`!wJ2S@N?cW2MKMU*tZ%x=m;DA0 zy{79<$VYHbp!fX2X|%dGAa1B{gTj#94rGVq^h{GDabKKmezBmIL0w4MabjtH@kPHS zsAV;qw(h3-8Du|$8qu@e2x7^!0M}H35>#bCjlkS3->}#sZA|qYx~w%>P?rHacL|Ke zB^45q;t0$-L3>n0pTgsMl~aPgHaYPJ(~Z3Umn;7!U#l21IDT_|7Jd6J-9`5PgMpe6 zaIW==XKe=#I$lQY5aSYm@sNIRWUm5@cNqS!aF{I{?&*b^4hGOQ+3 zW{eq@@Kqh~%n|7s0K(zgOY++B%IOi?_K>Jjfg(AEOH%ZLDi`zpY4>;h8gD~XceN+h zj<0U0X369w1 zvAK3jBOk;p5~Ll#4%A^KSX`Tg56UGF7gHpijE*{!#?Jy+^9k~mc>L(%X*gCvIlELv zyxsw^T!rVy%YW-v!rKf%ryM*-rq8AVjmN4^X52RN)8HP|S{|<4ubll1nyQG@2=p^x zJ)gAAl-?TZGkI>~3>4NxvY{CN=C7d&fU*JH>}Xi^CH#H5;xYTNz&?SMAYGfd-Q1cm z9<%00&=UUi-P^EAXFHts;?3R?vGef2bLKyUz(=l5J9S2fkvi|g-kRZ#r|hoR2ntn; z9Vf#&VdvETb%AFdzs<;Wzs)5^tff8PxNA~=vUm_W-fOY*8PR3(D2+yvc&-`()Y%E8 zp187>Ofd*J94HK^#K^2v>&u0ljR2t%w~+@_B(ODcgboR4mpkh_*k=@K^~drIFfS{d zN9`J^1Jk`F5%bj9x@jW+L~&}z+#jjE6i*7u2DKY78TS%*k`aurWhF%aHTa&3CF72h zJ-GLfC)8p#i;Yu6YF5!8hPY$0msgEYtzY>T4+0tfn~_M|YmdLG9N}P`#XEnX&nSC; zy7N`8Kw92(aX5S=2<90)IC$5fp&%s)$dUcs{?^R$CPG_94}ebh1=qF-+Kbi1DkeyVtJ`bL9z>K<7@=E<^!$c=dVbyPS>NB10QRR6 za5fPABRDrsI7i+QBPA(pBctfz?+>9q`6pI7X+oitv3ni2-0)gaZ5ZXA-|l!!;?-&% z6*+eMxZBc`@b{nIomMkHvjJnG`Vs?XrB8I75ZB(X+ERGm>^z6LTotimQf@P4Zl7_R z73L=HLROJSpfJ5JtBRPkOYTE7Pw)vcxa?RYG`}_7!SS5sd}G^WsWSAFm}z>*el=vf zS`{=V5(Jj2&GK}hnKk{&fTajZJg@p9L;ltFMBr(XzNAEw;-QA%MI9}Hi;VP0o`1ujA>w29;XHCa<_EIMl7D&-kF5lcWD;Z6k zw2QJ$bHvF00Q*9e=H2|)H1rUbSpkZR6xbS7)E_EyT`$2lP@mQ#1te-x@px*j{S-bg znpPZ52Gr-;aq5h**r7Og(6aJ_t$$&DNOS>(#(Zg33bKH+_Tfzl7>`6+3f9s!tt5{= zN6q4#p0g8)z2y*orQ$dF0S*Q@d!;bFG6HT}%fbEdeU3kUpTlmgepA_0Ht$-nrr!!m zkOuFM;`jZhjpB6Mn)hwPY{=?Lp8p?3UNE#qrk013Q`}#k4eOnE(E{wrgHU8@Tq%V> z{uVL@QC1qhm2VY$2sSdwd?_DbK^^e#M7F~S+KfX^o|w%<=WG4?ZoImXrZ=mROL|l2VzJ>c(SGS}7UBsa)y9u;r7We3M zJk~gXZpYO%ysrOHI2UO@Z5P>06bZG*=eg|lE(3I7w%B!mZt}V5i6AXO86l||r)*T4 z%F%R8qOmurPFdJ=EkT434QykcVlt%ny8iq|o9KHNJzjxg*Rd&V>WEFvBFeHz(?Q~1 z+EozYhAKu;w}mwwx;q3auB8v?4>Y#AGv{__HE942tb8O}MISXYw zog>fY=pt4#Eq^&UB>Ja=v*yY_{^Rp7jVP38y=?+7~Wp5+EAx%|C3JgWwJI$3o_#7^XCrM4(8+sOm7ncOr%(|M-M3PfqG>% zD^0wsYHh8pyV$W5L!K_{%eD-+3n|67SF~^&6Vj#Jzb5mi;}Ti1uBi5+X>{L`dAcJx z9e^^L<|DlHLp8q#+lLHLC?*4xfaFbAXn*Cvm8tkS@lNGzVR~6ak9asy@ISE9Py8cn z5k)E3u60c9IH+$z{#{_`e28#rJ@Isd&eN|cyB}!~E5R=0AM^qs5aAF!(E<1QO_>!h*i074?~w@u&P z>Dy%!Ge+;It?;9x8h91?=(#6zKBV$iPEJFHq^U*(nt2_tb3osr2!Qu4jX^%_XyUAGP zrSh?D*05oHyG2)f!Y0;ctZmw>z{&D8tQah#A#!cB41r25Y!!8a;eNn73{d_!WY((= zv*OaJ6Q*1m$>whk3F=y+lID~|b6%9BqoM~;BM7hHL>^W+Czx@lT2@OvcMz;4zA3H8 zz1p7jK=@6VFeo2u#Ei=0{)*;YC*^{$=ig*I0FE5z1{7qAT1n8kln8+oJ>9#K<0}#$ zkwEzDVK@A=n^H{fl~3CfzUcJ|cK$H(tv`*tUo}8-!Hspi3Epp*7_k>DWz}-%+M?E6 z%`iK7<>j|m>F6DqzvB_K#OEku zAGgbd#pY_K(Fwk6p|v?IY7lTQ0R-L!TXjuYJ1medn3P+pA+=QqW+wCC=S8XWU>QV6 zGy!Ra3W=7-;Eti!<|w}K6AV=SI`K|PeM=g-+XU$ZM&C#udah<%`j^yLoXn0Ga%jhV z5+WkUk$7T*4SqGpzX?n$Wd27$WwuW zCCq(e;s;$~%m@S8m(6sp2LFAMJH7ErWEl6!robl`*R?om^$*?$iry2A7cv?)I`0dN zFETuBw0AimZsizu^czMCvXPGmr;!WO8rwdt67Xg*J$glqenb;&+r_FB0GzV{F5Oyj zzYl03T*2#zsS=uKQjS{(C;}hEFMyh%2pfgAgFcEfMca8y4Ccj5RVTg*__kKZB$PBz z{$;r;FL8pnSJ#cn?LEvP;l^mvW>y!UO(CScXYqQl3gp#jMJ25Y8A2=)`di|i-v%gs zK^9kp2kN~ny2#B=w@a5<0{SrjOKH#lOli+O6ypcWW84X4!caMec z&VhGQ?&_^qZLSAva6I!L2=!7k-k7;(zDfr^4M`fTh)+mka+{#;)ZV}uMD&`}RlyqW3v*827xo)7(c?(?T;5f9HrRIL!|?2fPxIzWTcz~ zWV=NGITf%l(H`rhtqNckdM*o-Bwn!SwevqD@FNC#NFt0%Zc2@hW6)}JBBqyJLE`tK z`=)fr_;$(1&wn=2hEE;9Z67ZIq`a3ECYUpE37wXs(V>ass4DHFEqPF@2tpJCZCDd1 zEY3+}@k!KyVaI=>D-0H^98}7^`f$=-{B%kB-3VlMq169>-{9x&VA$DyBl<{txc&D= z%(lgWPDz;M$-!_-)u$UPBZ4s7OWl!ENdUbb_WoSsKUswjwM<&tZbg0lm*JwbEw}J~ z;V2~P89>KrBwpbn=6r}LY;Lm|AY$!30!4wI&Gu|C2?y?NN&I{;YmOyf!sDgO1iqJ( zutZ%I8)Oe~ZXl_{|8_{64fHfr06YQetb)MeP3$U6`B5kmz-kFslKPhIW23i9AJ&G; zpo+1IZy`{{$n@#BPE=7Ne1g{vdE{<50xxU(GS6<448P(NH_Zwk)=Bi++nwf2o znjs+>AnTh%b4L@;^2}1r&N4jp^2kvAd-o#+Zh(&a6-=mgKChAU@mfmbbk5rDhz+Vy zr{=5O(4LGV^Cz6R1CUz7k}V?43x>s}Iza5HI6GG(vFKaCQ~wZE(0UEl66ibA;wh`D zhymSKJ?bWY?Nm3MkMSwwRUBo98E~{gzLG5w!Ox4J8Z<4B7g8AVBm~I|0yy*)vJreT zkSp$vQH(h2TXJK^L7(x5s$|dqUG-RtKoT8emNKyFtvMmGQZ@hDS%yePLNK2{2Iy;w{&3lwwbzu!TB;`V7pkd&hIuO&-(}?CfBW9Y%i-JT zzwl%GqH)cv#<>|?dtI2#*cV?QxE?3Z(|2f>>?FW2^qvq_Y)hPRoNe5}QJuJhgy@>$ zgCgCQ=(yYV;FiH{hw;KK!-=MN1E4L8AYgsu(|{u81e+~TY703oU~YE(`+fJH{CVFK zFxun-QX)`74xl6lu4uOY(6u;neXY;i9lrN&gIhlX-|GmE-l1A-{$J$8ZTEKL^$u4L z>R4^O>gwFVlJ+Ee@*>`R=0T8hW|gf8iSw#My~Hyj6B^F~w!Vea2QtSVXu>T~*{?jW zX8qr*UJw{z+W_Q-P&Uu1OjAqpMaQB2(-1a3Ur-z{=3~!p1OV4R4#8FLwE73DeSVAA z6?CGW^4%y4>!OD%R`DZzGHQUqql|dtLEj@;B*;+%OL>Ton2(rGuyw;$3iPH7~N0ZzHk`a@7eC_ zuZhtY z{07j4owEXih0aO7;9iYj&2&}Jpgo5qcf_4<=7IfxZ{aPN!|V#bW&G)Pn+ZrVRC62yrxtVE` zy&OH~l4LFy1jvDx7uq@l1|^JWAEEq5&#DS zF=A_Zt~)s&9)dVGy56AiLn9oS%dK*OCJ${Y30GK0Q*?I zAk6Cgdk~}DZnb5MByM3I`rg`N1C_|rSkL1+hY5~Q%%!2(P&ID@5%1bFfErQJn^zYA z#6wHaSO?ze!+aJRr%X_FNUZ{_4zez+GiPkC0}ngpmnzAD9+idwwYlitk~0w?QU4(8 z4zgMZN|S8q@t!ZdJ5AB-Vrs`+lVuKa8PB>rLr?@E%<;P7oGJ-;u(fz_lj$fV)0S*QItmPvNVt&5bPq zcySGE@p8PEa#!Ti^?gcPG9Pi@%gq7$KZd^p9#u zDAE~Njuz0~Sa}bzCt3a5BO!?$UusG=BeVSiYg#FtQ$3L-9n+gM#pXOwKKv_d7Kt4% zk%)RyvA#SP@fhNxY}jX{2CE5IXep^8VAMaBRlt9>NDZbG%kVQM58OQtb6-4Q&z#7o zs-H6=zCZU2NHv2-smDbF%!C(c9T`6RUBwG%hN;&%A-qt5HKnA3DSo!s0Jn*Qim_YoSFKf(c=#ULjQW3tq{bF*+y_&Z2 zj~Gx+!e_g(LljD>*Bd-s?ZS7{_4|n(hq;Z-cRZ`s(j^1_-i3cWS?F+_5K(*g+4ZMc zH@E0ND@h6k^OJc6WuWu1=uoEWJpv;{PxQv@^Y6XBqkR^Gl9SjHn=A7&0a32D4Y~kB zcho;;XqC&o%w09}X8isk(3(=+&q(y23IXuU$Z@g~u>s?d#k$7`^yNpRTjB^W&yRNZ z9;Iu}0OY>Poyd+y(>DJ~B@V>P4hK+{pjUKRtG{3M z?w{70C(jlh@m+Vs$pZ))^8Lqd1AR(*3JLDu-|#h?xrTRbG-cfWwd)2}6ReL6$ppj5Qoiznip^Hw=L7?lW=i3Q%D@rQ1 zAOeVMyN*_&>U03@%s>aWiOQQ-z)a{<=`Z2Z{SL=1j6V3S#E4u{OWVq|W4UJvwD6rG zcJo(re01L<+);3)CD1mo^v89oc}n&OLfD5e@mjvil@WfRp>O)V;S=lp%TwuK1yZ{N z?WLPvx<^^uzuS4?`RIlxqbHuFJOMMJx#B{DrrFISwN>|})qCXeYx0<55ozeHud)hD zG%Dff4)y0tD$GAb-X4NYd;~*WHRO8G%u;@n4SlC-?Oor@}_Zi0A~pd&rgD8?y9;hn(# zhVqAyBZ_IH%>UyXyd^9tZfko&P)1PlQFk&QXQ#-TSNGT50`W^7@%Z)EzK= zE2_Nz%;Zt+23Yg8)~J#}Gcfbz9z~c4W99HjS)4NJ+mY&rA-P{WJzrL6tDL+Wy$`V7 zR8MMD8*oTpIU51etX|`txdJ^< zEZKKA${DpA3~>PI)&LST!&^n!9AlydD|6gOOcIiadBlfA>VUnyc%&jgftSs`tFpG% zQw%4PzekaY#lH@c8~1(ewtO>X!ZONuK8wp`t*|Lo{*N9O1{c8Ivh*}>Vy^sLs? zgu71anLHfgZsOT2KoaF4^d2L6%sIPLuzJZ0Oqjl)S-W@i9-#d$Rxw^cccsOc$})h0 z$O7}Lfdr;GyeYQ0)Q#LyGQFAT3udEVI**osGS}|6Q`wjBAUrhMJpqw1q?pvv-8fw+ z70d_$YpadOzQxWsO|+5d0oAWj-ZsdMJ4H#A+yU632jKl>OMsUgL5y}~)91u4%C~~m zK7TD@wu2_S&v#Qp<@^u!1w#hT8Ck~o|?sQuWx`MYZolL{WX8V zljZ+BL|l8e{n0ZV=MbyLuSv}P`*bohi~yMMacP3%Hp<8|seHdT6)Vqm#2OVEGkx?` z{dPGx#^Tl;V$#OPkCDP5C@z9PvadvA8`& zxgQp5IQM5lpShw4=fHhu+i!W8ohmS5r?Op3^FU(><>D)|1AD>?$y%6L^B7|J2r&!$ zk;+FLUuLlqbu2^|=b58_? z`|jEA#aY#0kf3pQN}+KV{?7M4j7vHHI5Ah46 zJz{d7xUfD)eAx&zgiBLu;GvG{!-j$|jo4J`1et+{?wfVpP{Px{6*Gf1ZNsB!+wG6y z2+GI=AT7ph0|PU-93dx4)72tQtn8HcIxY*>!dG`KH(os1>WR?9+rwOSt`p~I!M|K-I99PD#!f#T@}%ssaDJRY)bFh#zM49~3jxuHR7Dg{*$CG%(SVuo_WK!-KUE80 zltXjqq{W!5iM_7~4f>0`2(b^6OKbZ>few)OS^XT}{|qC>G9x?))5|5;Mob!CGS>u- zkU*w!C?Q1`yn5OrO@Y)kX8XkGdNQ@XNto3@xu)XwpTn2m0HZj`C(XYIn0waq+ zr1fCmkK((3?Lx__v=xZiKS|-m!k0${&g?6nD!xvCtuX6!uG=9?sjFx!NyF4iru?!H z$kob`#Ayxi9EI_8QQCE-HA(>JTHkS!|F_7h|F`yl1;DN^@6~yN7%0;qn~y#H+5z5( z9p4b-jxH-U>Nw>xv*0(5^x`(MAasg!XN@!Gv7kfD$GIlYaL5!a*kGa=MU;EFk!VSuBomU^1AM2Q% zFXvo0-;P{yqyeA_{8tS{?Id3?;IMDY$`!>rA_H0cw5&eq)3jBTDD}$oXHR?W@q$0>fRz4FwU~kKgADBtzTlPnPD7jD~A!9f#SSyw%WCiVjFwNW!U{8`*nk<737Xad* z-jA1f0c1_qdf9)%U?*hz_Wa}V{h0lkBfILssWi&=U#eLA{0%5?o?TbHI#X2F3*qX1&>5x(!hD&bc_#6(i(yb{Bm|1t`8OQN}MNe|-?KfqaIXUbe#% zkj?|3KGx$raXbUTA?D?SE#wcA6 zd#3P{)-(pdC4sO=9(Plbcx_;1$7hTT-cd8 z0#k}6fZW`85d)v7H`GN!V#rk>z$TLHECyZ%7u;b9qR}W3irLXw+iLmMvR^WjpH_q7 z)#dT?eOcfod~TdziTnX!2?|vpL)xiZF%P62m^S3F&s+^(8K-n(P1GqTef9AJ{r#T- zfUD*EW%ca-<<-l8SKl(+n6r7ra*>bby(xtWBQnfVE?#~FalbqHVJ+w`c|;yK?;)qK zjA)*hPPwFP(hE$P4x;qtJVaFynzXz-E+x6ZD_36I=?`e;#`p-KpaY9cNI^Rg30+quoZ3xFBCZY!tnr>v*<2#hlLx%Dn{2XVorlA)BS#B zOMYdIYo0Gwv55P(XHaQOxIabHc(G%BJ)$zwZ%Aa5)1CYX?%I*l>fZHm5)4*mkJg?| z{W#b?VM;Ez5Wom%ROuyZeJMF%)^uttYf_h6JFgH5BtQZZc#>i+u=+CgMYeBwYgPp> znpe^J7O$x3LkAYj`DtIqYszmi$D;GmHKl2Of1(zck&7hF5Rd`uR6m!-5ljG`5|QjQ zMYj$_-6tSFER=xUa5Puyla}BrW4?;`QYcOM4jHZ|{7eifyR-0rSr<~@mwocg88U2A z$tpCW29Q{H-wSUyJT)P{e{Qn-nadC&9wn?;@9O*d@z;Se#0+LEm_WOAvDV1?y|4B9 zBJ(XSy|{<@G12}&X=hMc%tDaD#bIk&PA`qMJ#}U~It&$1!-y;ho@KwqbIVahA_SGz zg8uRvE*cr`?F5Q zofMUCmEsZ~wOhzCmAr=Ztr6$W^-K;YdVL?sJ-_#JA}6>DUYx6g=eK)P+GioeN9rhc7;#!}>HwceBo0+6 z*WstrE^_aIlyCcYV@myXQH9{5W}*FiEnjcNoT^YeN_e?q$&me@x@{j&Y5>hWbH7fb z2=EMVfGPPka-EeXSh5?f0aZ6$U|*wzU8ln1qs=?J+Y>w|bu%c6O=*@x)N2CwQBg6g z47r=dM=~`>;9aMeTED@_ve7Pl2D*vA1)G3PO^x0`wj>`eXy=&<{(s?71UdrkIB{MVPVqO(QQ>%C6gIK)UF_+;G-Y2Ct?)VYn}frLV{%Jp=^W z=~#xyq9D-;yhdT{FT46RNEK8g)MSMLwM$;CFFhI&JG9qmL4DdL%?bvTZP;Yy`KPLl z-p=a+^J4Qwr=h`+4IuxpMq%nb$pY3~zRvl~YV^uj#N>;V^0UTdeeRrI`|=A2H5c02 zCdj~<*qc+gk$~~oL>Q}`2nRWK^iZ`a`!+jc7D8R*mWy;nHh{;A`AXVt-y}V~75$d~ zuymz8>xGkRr&B=_00j<7Cq>bUXn$4_V+ZdHFxbb$i$vB`GY=Ypz(QcE>nu3acF?Q( z;VXV_W`s4bP;GU;samA#FQLDEb!cHyG;pZVPJ)_?PYQgjsb626;pj9121e{NSdj+G!%YmVNxX5G7J<9uFI09SxD z2(S7mv`GJs>8MSLop1$~ifzedp250Z6in|a&85J-F19Td7zWcjhXDFs9^-0tvmsa>8-aK1z8qA~N z=YpSCXsZ$&Mm9W;3<@Tcn52`$h_~#HOYk+ef)bFJaJqdBWGzHaXbglHFf`#R@zy-6x_5)(gWt@JqbzG1kB%j__J7>i z>Rm7o8FsB|=U*$-{?)@JAR%CJKw)M4k22p7}Mo_Ec;6@$L=|+g)OL@AtU=){RWc zc=4e@@1oU4?#4yO3u7d^zB2tar;XiTg17tV7tL{r*-p5a3HLS>;M{t0xBu62 z-j$R#_huB9_g0k2sQ2?LzB=2wyRArhn7!oKPbv9RT-th{e|@v+Tb`phLvH%%WF`Op z^Yt!&9&l4~SvY>^e%(*uoVHEfT~^WUl|J2%x$fKB?5pJawQZhxr?+oxJCvlY8VEP! zv}~M{qFwgJ{CWPjDPNPNpHJ7>eolU~u{AIn?xDgD84j81v}acD|C6)i#iG_wj?hp1 zM^bqbKRG)|=K~nVJh=X%g6#K>e>pvFUem}$2oKJ*9^*%^^SM!1sT3b!Xy>7J3AXU1 z%xMP}`G^A#v_>$hroV_J`Rf?BPz(IqBgJTjEAwU@UuOjp6 z?Aw(!3DPm%^p`i>7b=;*h3j;E9{D^hu`01G*?D}&t|zBL@Tdf+Ez_ilnlUR9c$U2S z?-(97jg-w%K73_wWzFu3r5Y=)Y8xe1>~@*v{`2(v-xU_z%mTCtz@ZEt9k~CwyfSWg zW6_||!%|2vt5oVY=Cx;GM#O!32itVX)k8C&|AyG= zx6$~nU!$6@`K%`A+Iy)F!=fqbaq!&__J-gRy%Kg*a#fd|UnRC1>=;Ft7mCPUE>AmTu>Z;O~zpnP-->Xl$ z2m1zxT|YnZYpKA;HWZ!|V#AFb`O#e!K2JwO<%6X|qn4^eqv`i5<)6HB+EXB&p4Hyo zp5cAl+YT$lJ0RN|u#B`M{#TnE_<2Q31>mRm^vD8P-<(tVE8Z5(etE;?`x1?<-_vgg zKKa&k0p1P#e5C6L3Wg&Ib37N0YF=)?Z!!h0M8Ih@M^SoUQ5}py7Qr)u4v05g538 z-!!kq9QQe4-Hd~Vb_XI0G#qBCs(rLYgLDWN!7C5HBpftRWrTYy z+kR;^YhdxMkf!3HfdelfSmu`W(?{!+NHB|2iuE|m;7Ei$MgA9v3TQW z#*9|^a)Gr!mn9_nIIYXs7Rzjf|vYPGOE^02?biSI5O|fk~7pN zzbyXi;__o>AB>J0Do1C}&Whd=zb)rN;d}J)VTO2o#)2KAAWr=E0N_%Eb%6TSn5H%@S@CrGtiO6ZF!kgk=c{;FzeHa7x(u3 zc~DJs)bz(+?={-*2rYYFb0sHvOT0>sp|aDWI!HwC#21P(PZ!QnI$XI4uFBjQ+IC{f z6?}hY0GW%3Q$&hn$U4VVKRYsY2=#ExQOKXTS|GT3s&h4Fk<-?w7yB2TR2)QSBSN+xb&w9Iq zizD|>`%SIlNpRdH`n}qnQ#y9_e4PIBR1>_W^Ef(~r_!PX7_J61eQP_cN>%xNfzRXu#+ z+t6U{SlD1gT(4jFkFQ3igCaMLglYMOT)p%E=3gRb*4j#Tilt*0q*vLx0x8V@sUxQSR0Fi24v?vFD~UvD-@E z^(;7e$U--h} zSk)ixtnn+1h44F6+wI?cT;v??Pn)vPdt9u_pvzI8FU)cO@q0-|OUJF$Y z&)%0R3iuWfQkDwo8mIwB_B^W}1P^4Qb;)7hcWV8o{Z)YQ^V8sO2j+AejMkfdz53%| zfULcI0J6U&rNjDo_f#BQ_OG1ey&`W@X*qRFvyrWYL_d!8iI$a4JT6?u>7SXr{fJtP zM(Uwi_ZKK9jJxFmC1h&1bbNp0FFI2WjO`U&=%E}GWiQ{gp{MJ$e8i&tA8Rvt{KSUw z7m%gdU*ZD~mkic^Te3E_%v_qdy2Lg>7hvlL+#auop2O--HwTd_4{W)inq1ri!BH6?bJWd zX}nzi-5NDn!A+6&H+an`t1gq%FNIsv#laTMKaO_|7Bx8rX^Q!W=3nV+ddz9`{PN;2 z>GX-f@+GiP;t$Clb?gP>W7;>Z)zl)};kqiA4ERrMOVT)8)e}`UiK+-4yEbvw3y-`{ zqs#Y?qZ`#;ak>J>LQCYkfP;ouK&D1R;!I@&?Xpy1pZ#{u8T`)HKvKp~ev2HMPkdwg zo8GMV=ahO0bn>^J0~rKe%vWa6;(0SKB6FR>$&P6G5!^;1n`s*KTI6tm2{swZggTf7l#-6ncV|$jE{i)GZyZ<4sC2bW&H__-Xycxg1J+xYnH*)yPzl*fF5n}=Gq`#d|iSlRG zL3b+FOndFAIy$J{IA;8SKD%v={x+Mj<|S~Nx?}dw{`GM424!?)X891SamaDrl%6Nt zjrRk*AkoiKhf^C`?UvCl_G!Og@T+LLl1rbvw#`I<=ox3h-PTkARW~nC$Ksw zW;4q@$t736Ly||L?=9MD+?OGAKw2v1bavZWj~77@=8uERF6^tk@z!JdmCNs^x5iz9 zJM=1#%J!&H&rCydjui3Z{6DI?>`O& z=?|6vyiS4Nj(@rrbsS!kX$fx{X>u^w(lR#& zk~H*x1Oq+o{dY>**WLa&xseG;@P@L@y5a!CDeup9tsH!j?Ax?0wyxAE$m(nU!IEp( zum_)RcMh-|B_@XCrDFrugB{&L6K@KiOz2&Rfd5hImAo$jmN{(-jJ!s#zzJCO|TfqHDPd#?&%z2Zj8U3lKubwkN3yHJ{ z+SInFYc3>3%Z#n;q{dZMxTzrPf17FmK(`AwB`Q?_lVF?40jjr`dQSMXt?7NZY^-T0 zcS^N?!cCK@ha;7Peic33l5&Vr$Pd4j^lIhphSJ}Y*m{E_#^sU?L+_TL-&-T^4Hvj9_gMKc(_;<{;PNhn`bB4;+x6A{bzD;6*t!O;!DjN)H$+%jbXmC zuz74@^O6apRpeAwKz?p4ZjGC%u<5~+$?-X~!sC?Vjwut=`U}d%r_&~S(EJ0S6q_#@o0IlldAN3Mt7XYV_q&9WiSAx`+m-k)akd^^+rt8XpZ@v`OhmCma=0dW zplfS+_S4+6BjH~ia>54L+=f}C(fBuHsl^86L*g1m48k3gPBw3blWwLKQ{^=oH238 zs;`UF{;+VO*^kp@*s)aT?|u$%@7BO&jX~saTDB`Jx%a0yyP$9o7oP(xX8ZjGq!87? zGc-e_5KTU=BYvH47X zY`UUQUq@LVF4Uq~hoKeM`}BnRarnDrdkE8-b3{>Sq@#=+eTyb}Sr=DT5Xh8bYj?s@ z(IF1Ac>?}Ky=tTZ5~BtqNri3#bgaOSnwlS4}qwVNA^l) zD@OCn@i1ncsP$XT7=G4FJd>=Z%Ty>0#_a^RO;)36DHP-Eo5_{wG8al=yFh_k|D%9a zTu(<6p8b;f|4U4+Di(MqUO)N1g2I`&Nl5^MMrI&c zC|+AEIT)$Y2uM_;@qW@)twsRys8@)^;lv3h(9(Eek(MIyrD+Qu(tt+f@dHtZq#aG_ zuwwD#ibS;Xpc7=Zn-oGG^tLE<&=C@$(A9AyJBH{3LX|&uZzNvKbeS^ zy|56DgzRXnDTPXrSRF4QI6t7zSK!TmfUQy7Y};~yT%eXmbSr36x4)waI>T*0g+(i(H3N1E znfYl#$^ zq}7C}Y`mfV-&*;KTHk>n6(?QaEEHSlxY@})pzM26fv8plm`z@x=b^9?E$@OmT6sRd zOY>PwX^1`+V<>&!V6qpG1e*?jqY?!r30IB0w%c^;Xjezm$RfNu;Ga%xo}5=WZ$kp` zV8u-+T<^~rk;nDjur`SL@U$jO&FETGk2grCKdG8eShRyUV0+Q>lS0~)64OnE{?{Sx zaYXA?ZA~erISMCN<2`In{5N+YUopo8T74ZkoVCju#qewIu%gP6({Qj6E0vbX`xlb( zE6jyHcuU1kZm}7#b@7sj@<`K$EZ9+j%sTvy;bXr?MO9Cj4_pjd!-xJ{!D*JH6%AqJU&68}%e{kV+H98Ynt;@w_u5P@qxDD1CsSFyK??1Afmyp~SR z3q+cHp(sjnQp{YnIn))RuMVE6(ic#b7Qhiqt|gpnY9!b4nF16`OG;DO69+^7N-b9N zNQeI~$LI&@@|hgrSVwp{IiGXMxk6imm{RsEbufUBy8NH{cegV?c`G4>rG!NU{%8~K zN|fTg710*hg5$42_`a-<>=6cAYISwMv!ZC{WOrn#BV%NDb}MwLX$!B_Dmkn&HF92V z#iVDuRxy8dpvPKq)fRWi)koeXwW-B*XPlyXEbmtXaRuTf`nN1l6d>?1IXJ$F)W}p1{wn zc#Xor_mkqO4Vwwu7g3&q!EX6Z`cF;crli72=b{M&VFyNiehLd<3gT>sE4NU*1m3b2 zEZ)$zkcE*wWnV)rAJ<$2IXcFE-khvh(s` z?Xp>?=FhabN1(lrwjgxnc_Fdhu7hot?3Q4snNNpJEYP7ko+X-LF~WEhD~rCA#YQr=@X~nv z@{O?lp^|f~SOA!}e?A!7v?9=A@30}-_ZZsEw&ywBkp;nU*Q{3CIwzS1U_R-VKV2H# z9%~q;in7|=Bv+g%R9*LBHca6AxvKm3=~iw2XfH8ET%L)i#Ii4|m>-}l>U3my`0yx} zdxwjm-1Q$+_rI+n?mfFod_~CRNH(#gWwAFMw%~ZbZdk1fm6xPD)(BnSc{W17^Qh#2 z(W+ur&zL_FjS7x4EPJmz@Q0A-K84EqTUMxwkSRs&?<+jZz@}o~+^%zB3^nvpb!|4_ z;ht!UB!g(ygqgZz`gEnUZsWuzJ6eSj>bAG$V+JV<`m}$z0s0iWKy|<9DBruc`W<10 zxWcqBMk3gxC<@gfZhQb1*z@t0AMXAtF{8N9+m%t$iZH$GrHU4w5zSiALMm>-$TB)8 zGA2?53M8)0UV%_`G$q4XB86p|4Hew9=6m;57ZV3iiy85bFjqz`i>N%;nDNyx+VV$G zfI}D0KpoM{TY^6k8r;cCbLN-RVPhEiUwYiZmJ}(WuuIi3wNPI&mG}Cl3?9rwgLWFf zZ83LY{fTTg6E(!J5^C8@9 z0*?Itsc79DM}EM>C5i;3Qv+sX8T9$~0m+au3bc2KtzC*l_7v)pd>KZ}gR9j3o^82@ zRf|N%X$ky|)6q+4+SYK)ck@BFVfcFWY}Ngzu~4HH^Ne(2$yC&FkwQ(4A1`yiXAlPM ztDKL}x9O*em!aNf?Iq=c93{kBK_zDK%l(5&Xkb@FDIb?d?_S0aQbBsrwno`Li0fg` zGoeeQ@7)^+khXOo6qMKA5_cuhxwOSJpQR{8l}D*^9Nz5m9Ip}TaMJi~ZfBva40&xN zcJMcXVDTu_yqNLoSXqV%KqvEgs*Gc9!=r2Z-B_OJ?h-};VXlgfPuSR^~3C z=Ec=+MmBmp%0-XikpY3P1PmZ9XscW0!?%^NIk%gM5oPXPd%c)itN#{+-8$-^q47MO z7_Copa@9k3l^J{jBs6$yXG1$wRy*JalG|(Tf5IMiv`_Q^KTsJNM>`vIt0FEzp}O9X zZ35x=VWH}o{v4CSsSHn79S90D`iU}71V8iA_R=`2Lk6*JN@!h)si`1{Uu0lELYOOY z-`NlEsfTIdQ+WbMiQfl2Y!&3S&;LZQlosH2Nzu|}S)srVAzCyA`qli;JB$6pU~B%I zqgo8})imUkz^N#Z4Q(b01h&ZQ2i~|r_X0(~GGv7(n4}7{sr%@)uqn2!M^p0jeYctQ zyZAPWqi*&BwCHM@lwYcXcAcY8Gh@cpBC`%jzya-W)cEqexVq9{_i$M}XvdXdy4j1- zqKjz({IDr#*MBHfy_oT71HZl|N)dV)YxzRkR zt3S5PPFp~SV2bVXj2#S)5{g+#O(^s$?{6qqr8@Atx*99_BU4ez9n-guii!8ji06Du zB~%(M3uQ=^(DfBm*J4@WFPXndMvY)P*#(Z0aV2znrP`1FX~qHks|`JxXwe^O@Q8pq zYSE<<3HW&$_)!S_@ zeI*N(6se%zE2eL!QY&a9s))5(a+L^I!RsynrD5ZEhuM>U`?v&j>MkdZFTAt^^+sr& zGF2QiuoT&V;D^x5N0MXo6DMXI-NRal(0o`|9Z3))8HuJ-EZypZ5L#u=Yg;>3&FOQJ z6w@3>2$+$UIMcV5)N=aB6lA+X@{TBj7Ps(B>?E7U6J7bzvTfwvLFtbltgs($C=R>V zXp9wxICek-+01}eY2|%v16rMb+^|vUCWO?^M?AbFD-2@)TJDEZba5F-i#b6x5P! zYN|oy&_+}cOFP4t;i-%lkBH`%TQ(ngPe8Xp+nuoIjc%LH^|#l36>FK_cpmtI%cKEH zbTIi{lBkS&fjf&!v*v?(P36go@0C4FbN-kzdZ`UdQ_P=ug3!Jl8rON0iRsE-R=lS8fmr}#Db$L-&AOin zkmh~cHLk}|CXlk1Au6#7O7J`1NBa!F3Fa;IY*fIFkln!SgmGAcg+^4BQGc1nW_b(+P37S?WUFg zveDi+zSaVXwtsB-mKI9`7sXa*ZT!HC1tWw8XnLw+F26a;HSHa}OAC3;^}qBzBbFFe z?nYWdB#c$7w?ZUe;K`Dlw4C3~0a2-d zlZwpg2UUg*If*GI)Udb#J*-|bewP$>%-}tb9aw~HR{3B06AVY!GDPFO_GXlWWIz>h z;b)+VV+^p?7Vz-6l46M*DgAEsc_3Jq(p>q?DFh|fsCy%vk9fSrd_}fvy*fJahhnH+ zCOoIVWt;c#(!A*-YN%y}|D{O#%(wv+bYMls1OcJrE2k*#24lBkmS-GiEK^4Fe^8ZN z68y?ALZSt{VWVz$#9eGpydnIayYuQ}2DFh4u7aB1d8pAhR|WN4ilL8uwmVM%+giDm zmlGGhr)N?{96uMq+{qGZ)wv5-BU3sdC9K{Z-7Qo@+^hCPEFpb1S)u5A|4T|3{WL^r z(I9B*VsAd)>2OkEbZXQev;`j3|xC$4-7kAuU&v^Gc3vKZi z;6B`^9gJ%_w32a=7>Dt$QTrQ7+!>`M7Y+!Qp(8)x`n_fQggbHRL}G;VA21Sy+b6rE z{&D&FOIES9l~I@J5LGa+&!%^M`%8;nHv_FRe91+2n(mt# zLflGYfD3TF#L~-tHTP&-*)muxR+;R5GnF5b_bMQyiC4gHo`Sd+0b8dThq-NT5Erua z+_lkbO8-9B%%C^AVVjUhUskkP?8DKo0I+T}Hm;0DT{M34Cu$;duBG<57L?k8E7zGX z@Q~iwJ?w$F`#YM6fSZO?qL1I~iMSKnC*OF|5Mb2af0^|RlklCtSFEi*1@YIlaaB&@_fAy3e(#69$Q%b+^rF#)~%AWjM(A#u>GU)9@UJ$ET*4dmUL*&BvUYN4;y;He zRFLimx>IOKRHgJNe?e zgA%O}utVVz`69G$r^e|hO8@@)T(tb+KGzrEIs_IntC!`)_FVR+@;c+;xezY@(U!q8 zCT!!Z{_doyTm!~yf;A28d(%jmMPH@KEAlARetLNY5;@|PGGQ|sCl=+yHD${$dbk2x zky+$uF5Z+UC{6Aj^N*x3E)agE=i6b01@m#KOgC=BA=b9(%~>+APO#=%W~?J1EjLHnFR zUN0Xu$d>z&o2F|?(YqcyaeVD8B+|`^s}8iSqJ_5)Xx)bo09wKa9vY`T)ArN5#%_Di z>ZXZUwnmMw;$mn%Q<2vKaP-Y@9+r%74j3e!_n}a`>E&W1`Uaz1S>@p>S7@v@cx5bU zF6km6Ju^4+iaDSPk~Iu8UjR%Q;5U0CF9wWY1-7p)`G)TEP~YNv%w=|@!-V$LTqgYO zUh9WV=zuG>md*poFCMKbGf_p0U@RPr@gC2~rqwBn25t2lE9MY|gb={g8}c*VF!^pk zL>Ai=pFM*gk!beE<=c7VF#{Ewu#pknw>4;d0iX5X9RpNk9T^un_DMnnZJ0&{tK;`= zlQ*qG1vQ?Fm`xpauh(gQZRoCo4lXTaI!HAn&)0XtO1Zx63+bX%K{DT@T@>^UyEZU<<$Z6(z;QwEjXHdOn^nlk2A zujegT^m_z~F z(yWY9&Y4c%Yp)$wdvYx~ryIfhN`6TX$}!M%OK4kL>WPq*-d^)fU#O%fh0vY9B3?cM zA2!LUSfEBfx>xuEsvdGSzm*0;7MDhp5GF1XO>ndJpCv+8T&8629d<*=X^!eIrj8eh z`r^!ZB46pmdtk^`fmJMsGvP=84expaN(K)gc3ca{=JOHjG%{=%-HkPFk|j!}ZQ$bt z^+V|&z)fp}x-U2-sJijeHqtrZdR9EzvMACiQ!t*>d5@W>Se;DP8h4kOu0RVaK~z+? zD#CzDu=o&27ioW7KFjXTURO>~XlF->PJQ?$R1vc#QGOeA^qc32v?O|9eYr6(8`iwE zd>Usa;@aW*U(*?3aZVVol*qSB*ae{bGj6#gTWxkVuQ(3|6n|l)a1fErM*rD=Qu>`- zQ~BiNzuWU>G$)VmlbPWpc`vLRlixBl7s(;kB@i(XY#7 z9)MoL!ErSh>ruhf?3F)XyD<_KhLbF5HCMCiS$l!?CSVXiaxM~pcOXPH`<8aUvunB? zhD4(0vSX5~Q8pFqZ|}Orfa?T-w=%(q4<8u;?-L8aQ7{$Om=7DIb`cwuvUZB&l0u}+ zGD7Ufwu1R9HEy)@;DJ@!9A1lU&T{pC2<+mFSAevj%vaE3tM4@REQ?EF%R3VAAGgi(ORr7GGFzMdT+58i~Y2 z>)jO7=`VPPjj~5RxibvW_|lusl6O(Ga=I8YICdeilw#CWLE0ACc@sSDZ9Xf2QWe z*IJ@>Y(q;x+Jc-j&+_7MS9Rbp#bQl{@3{mX-;7k|1lBz!zT{*CzT+ z)r(64DtBEj7zX%)&5)L8chkGl(zN-l$ZM_H>OEn*4o7+w4+8ho~|703AC-J>>U zI2|Ye$H$}=Hm-qf@;>h@3 zWmoNY{E@@@+HoM5UWdT@UGxAJ#UWajF0jtI)D&Ag6P=)IOli7gYnaX8W`a`A@fsj3 zjpJ%)atONLgxN`P0b2ac%8V~sF=er}RSPg+xyv=3{>45orgoEP0rbXu6I+rrq#xV% z#yKyuIXO}VtPt?`FRy`5ax~g0+=$jp>uSq#Y**qck&A=9bJ2nf6Thi>@jX}NR zdl_1OF5<2}Ll&9S-fh913wtB^nLeN0ngC;P)!T1wjnKp$cj2^_Mc5H7-)8OxjGoB) z<8pm!!VN)z(os_|@Eu^YmdZ=@s=9HA#Cm{l2B<0XCy9AWPAdPP9i{4kYoCj~3%zRw zCgxA`?Tuq=O>GQZXzhz@ps~~};2-@Q8KA@E0>A?Y{0o?obEw8~wZnUfL?S^Mjq9lW zvmtFU-A6O!7RdgE!*N6@_(A>HLo&tT5N+OJ{p|ish~I3ShGxQ$<};oUuBx}YcS=Gn z6YepSL8)n$#^%f^E81h;d^_zOt!q>bJAg`}tuPill7M!FfAiGKjOiK6B8lae`?Y)@ z7Pui;!6INOo%(1L4 zngkyHvt5(j_z9NIAuTz{bzVcCvM3F@>aZkRuPcaM`5bVe%5SUa?Hs(k4zf{W94+F$ z>!t@3u=L$^C=flmateDgWdSgq2HEbe^Q=iBSPe=w1alYV=jQVJl$+&su?HPjRYzBU zjU10js`AJnAf)2;;|Os*8@qfMxow^aB+alz=TUxj>eq(cKho>A0YQDmhLlbK`<1w2 z(_A2y=Z?8u^cGA2o=9otB&YfO;Q*VfddJbdu2CQXNAJZELCT^jcpR9;IxPE5GQtf2 zv&f)#)1;uOoNEIltWyU`eP4Zfh`35D8UD(YY*zA8_Ma{MrW-aepOH^kUD;bj$WMYJu(Pt{#Kwo;K|haE^J!hV^Ck9-?vmHot(>(+ZEGQ@vE=31PW38zn9aD- zSZ30`MzYs+87PW7b7*zn=Z!celS71GAb(I*t%Xnci3*-xfo`o=hHNuP`pv zgD>{l$ns=)SRdAF)P{zS#1Q!pD?trN$%ZMCJ&dYj`54zR4b`^R!9H3=!rf!8aXIbR zKqeQx!(o8oJ**#}ky@Jj=7N(j{EEA76&-k?e))Wco2xb(gJYCAF>^7XgJ1&^qr4 zoRb~@W{w;5d$RnDvgvhGP~u+^>tdY}li5d*F0L^kyPOJEiYrwSqCU|4*g(EQ)5(W;#GFR*hVEA9l$58N4(qV!-d^V zOWpnWKBt>BC6)e+p3R_Qi~ek))xip9E(Px^AKI#U63v(TP%#mZyz3^j$)IXKtBwtu zNR_LG@k?i1(}T?k5Z$tS1!8C&;*v0vf4#fGjA&2J+9i}Gz&gP89`yM{jNQ$N<9B6j z!Bx?V-OSt1x9OL51%U}vM;9M&xpEHTbbYBNev&ZxF#%y&5|GB!c>fhJVAFoEfCePO zL%j_heD<$D0|(WGx!Hc#1g1a`9!b-@n&)f13@rgbtBC`GE|`syKD*6lhqMEzJy8q5 z?Y-MQnT7|56zw)r88af+4QDRVv(RFjK%?isgn? zo-AqhMGs***;_U^XA@))HpV#7@-WW%6s-r_d}bq%Nlysc-fstp@Wi-V{j{zYz>$5f zSiA4quW_0o36+>xQ3K+eLiCJdd;GdGh@c1bZr1%jo9N;WDwr!zXdHHCB=+vIG7E`~ zajP-zbEsLu4^qb=?_XHM9<1Z}3>aPRF9S!L1BR_?Z$ffcPs2gBoQx)#dgCn;RYRA{ zB3}yyhCak7U#>=eJ7f3&>u@$>oM4yJAm*7|1pd3_C;)@9Ad(Xo1p@sRonLi8*ld}x zmtk3uGDMeZB2(aGcEOhO>p#%t^WG}G7RS#u_``g;=(lqq&| z%p_RHe(H;F+Kf)PYMj0is;8OvhAyce02}P$kR~uJ+kK5F_Ay@SlIEi5$m$FH528pt`;>E)X7f6ev7mjUYmW< zGT)$d-jiDceEEhv9Q{Boi^0Toa>B1*z;WQ~odx`+Cqs@$?@$!2+CGOVUpbO&K)|9&80M+zH z^ZGZf;q}X|fst@~2=Ub>`-F5s#p0;pHKj|z9O-BpXwKx{c5ixY-rd~)3It;4MhH#1 z5Z%{TbEN84wdUrzoBhtN+yr3-z%gd@k;HqqNv8!&S%z=Z<5Ayce*?Q>*7ae(iQ`J# z7ay0$hU!+OS94ycOD$K%wtd~7>B=cLVK;`pd-vX;GYUVq)%i zL#`@n`P|*et#9Qw8f=h;K6t6J^oBxe1d~u%SdEU?~3d zha{30;2|W{{q2#nEupB}>Y%=P?L4tBXD5{Jcz{g`<;~jea-AdHL;{(cu@0b2H6||1 zdiD62w7( z5HWfhpu`$<8$U@oz;c!znEVvrMofzLw+sCl-NV5NF||`MMod$I-DYM8YBbX%8N*6H zfO&Eq^LX!cZQr^XtuLj7@$e@A70~$0^E%_*ci=Mpz%;>5TC@khUkQ~gP?d;appkTb zh?`woZxbwJHo=#g(%_{w=B=@&RL@~ImX+OPCk{i`y(d;;KY~KiJUA7j8fc2@KK(8; zNAn&#aN@<6oXQ0YB~chs><60zxwxV%r*zquLYzkuL*WyyO6c2iQEDXf_wmAlb_ja{ z=bvVT8*%|C2{}PrEdVo-yGn_^W*)@JPyT_mBk}?VG6jy{50BN<`C_4OHkhNs*~>xUjY@@Ft7dfSKLAY zf8)tVh1Jy)wd0|ysxv?#Oh+@%N1&hIgCFJRnb1ceS8`ktHHOTFi|(v+H=<0iv&qcW ze4ql7WC~1nO2(8#|3GsK!SU%z#POz|lAR4Kfg?xzEq2U^Ld~`qBYiP#^25* zHk0U9nduuh@iLxSE-37%yTgZ|7D9S8SNK6gk<2u~?;emW_y8T=`FNyLs$jr2 zh0L4@1@G(upRgFF;9z*F6()mm;WzgDu8DgzNmKLXqp`Kk(`99{5`?$yy0buCbo(|; z_)$MMNVjwn%>+IN!M)mlK-g3oOOq$tZ>0O2m@@3nvPB{T|JfZ+VSmj5*XYUej023Q zuO+GOmdDcuU{zphIx?7H%~?*u3CoP17zU9xKp;;;_gASYC))Ev?0`2mRwGxd9rV)3 z!2-e(i-;~*%Ww<#;c9JXJ=AsBF4Y$j^cMsLBbzYPpN@sd|^&$)a%xZWdAJ-vj&6H z8b!JfHf(S<1^qY`fDEnKz1$`dB5uy(Eh&3|oXk_BLPEpY08nMkbU)3aCqRuN?f~?i z(+7PIafm5PHvs~g?Qep)Im9%AX#ol&F3{fGqkh|UoMYet94MB_x|q?RTFh5~Zfs3j z6D9^WQ?L6$4M{G(EH#}z>m#rcwJRi$z_~M_Vi~w>A>In->qHX(;d7aZW);61wgWUP z|8uUT|4zn}0rsKo7-Ey{s(?nxvLi-_q@k}FCY(U{o_bif5wJ4~yA5t-8KhYF`GS>V zUzQaM9Bhf3Oig4{_;ER!c?tgz4(nH(0B%ZIC5cwKv59LnJzcwrjVIm%S!21`(fqgr zQO*bGO_U@Yjn7fSi7ivS*7K|;k{82dMd4he&(C^7Jj+rvy(ojF*x7UlF1-jP&V*F@LN!4-n|StuKgv7;#n)sNhxou0m&1y6Zi`!U4Ri zNn~uYKvk)QQ_XDO$H*TT;p^ZOnHX?BL2CECc|#P@mSi*4@9JPzBJ~IkucllzosOa| z%lsI*uQ&WEv7-6x7lQlDT>vH~T>x-t3UP-&_OjRmD12lxNA(mHuz$(|l4p)~b^2&d zm?gc&a}9gR+|AsM0r@!5`PkX`iLM=!vlJa!sir(H81SzFIXMnTb_*j*F(<&nJRm4e zJmLgU?%%gYYlgtHvg`CZCL2(xw;)M&~koD)*H-yyCn7pF>UlI|!_@eXpD zIEF<@H0tK33-lpJ{beF7O5c9i~zoQ1ssPWMlxB~~WCvjR}2AvopJXl*vL1{c2 zfnFL=le_%IUve4JJ&bX8heY{b(6MQtZbF2ften@YB%ur=%NxH-mLP5q#cPMLkxS13?yy45NtR4_27e#Tsd7{Ygo9f%BS1xd)k-0B8HqIsj(Zuc((|wG&JWw{nJ{7kj!wKESWePR zM1u#df@a~FA}CdE^?e6mgkLZO0h#ll8qj>cR)CUOg}Zzm!-QoJOq+>1oHeGP@hEap zx+b^EDW^QaG&xXo0cYytnr4WX;P5XgEO%Gn_rl5DIrCbn(O~*xDnq zzcAYer6k80?%n^hOam@+86q<5{z?7HT?QFRt~8S%N#dU5@c5)T=!6@r;&F(YGjg^1 zG2sYG_zaUTh?|S~lGi#ubC4Ej2<}!&|K9p^7lolg18I5uKtXy4U3v{GpiQXvK8(;} zyJG`UR?>+BIdE`^hDmcHOe-<`Aj+VEBbAW;g)=al-6vh6y*y@`Y-9^tFQ#WH3U-3N z=teu03F>I(q&kJXtMEJb43jJhll+RUj`-yh;NIh73|w1EtX}s$9q=e%bDn!fK#4{skPTSiaa-{h9Ws4*>qY; zvn*B=0VIDOthG%T?|IAs2GNzayy}>6yQdiC{tY?~PMtm4;`Iv%1mSJdOzx7e=y8T-L9gQG)@{01vJ<_o4X;Y7)O9e^j?g0ysc zSI;#-i^IV5K>546WLDN-wyi-~p6v)IW2!0FlBt?B1Ibjxk~NISpDpKnXa)pcuxiYnO0y~q%I#xl+t3W6M@%qfJm!y zVv(D<_eqEhzBIzSE|$daAQu6Yi=Ooj*Ighr+JPjy_4UCCS-anS;stmcHqH3>gzPlV zk%0e_RxrL0Wo=2I=EIBwB;iV4>%sloCCLf5Ggn&_!7LC&l2`|d+Jx|)7<4n9n?d~V z_B*q|U z+iq{(^lHSLGu|DPCcY9y>b6-FaGx`wt`tAlLV*^hW?4XhheP?65MEjQKy?&QD%@DQ zSOrZ3$)tiOx-*4CI52!Kq(F!t%8B|YVTRq;(tz^5dr}gDY$~7&SJP?DQ!i`*UXCj6 ziNhcPy!eo^&OzG4Vli9Zbo$ZGU1uir|F4H_<>-Yif ztAh_rOj%tE=-(z8*h^bL3;Iy$uH>|4e%QAd2r~qGgVXfa96H2RfU_4p05UY;_YzT*z$Ake`dQ(Hp^P8h3oo9~Hp{8E&+6r2}D zncI*%M8_I!4V~mu$uc+*SC7n(dbtZa_6qC*ju5NIq>_X!tjrILKZyD>3ly1-FwM~t zKGQcyQD(A7DbxOEndP`lJ~P{eEOX=EGC$xT{A4}1K_H_gMa)tc%*w6V))&`=x4n%4 znQo?sIcv0QH}q%2R*5iI=xDCqt5HQJ@*tFN53xz}tYc|JzY3)B{-2(%Hm0pI3g4FL zOw1M{GM2cCnIm*;vM6XA3KSS2YsaE=TenVxggD9=3rm^I7S;=X#2@0ajW6dYb#RS! zmXERWQN-RjLk2DrJKP4$iZ0_rq+QYrl`^Q$=~er)_w>H+d(M5|bIx;~a~s}xUCtFd zDSqO8i2xx9S$aL27-m&|<$=Jr6F!L|jKp-D@vh-(Ay*+22|jrCH`nabUgLMh#8tY> zQkbvgnAOI<9KRlaGSf)4GikHPzrhx)PE0SFm->N6c^?p%7n+{sQS^kyp*NRpFa2aN zen5?(*>kOK)!YX8G=z+WU^6M+IT60`;_B#+`mwyVrOku#0hCx6_NkEAsX^?>=8*qb zha*)Q$ek;^VoFuK_h-9ch8U>-hIrc{3o##vi^S;20u50nyIjxe_u7S-BeM> zMSi$-17`>16@|5?CFRvj_pGe9*bXWEND`TjBgijQ$uzr5pfcR{iSLCW~b|2 z9E0FnhfkU)$zr=f=8K>~O@xbO1P*BN%$MRR|2wlp4%(LmW;^jixtY{simP_0f5ig%r=+OUlY`&TN9*X&#T}f_=epBC8 zXO8*z+mlMtj2oH>uEZW$I(k}jhC_D{KJ4=pSB5cs6cq0aj&463Fx!A|lD_Z)8y!kk zYZ-P2MluDhOMPYc_JgI9ksZo2ATWL_R3BsVen?}3t7@Nqwl`sPG1>=Bk!=7x%+_rti*TSFK{rM5-zKux$qDT0zm=itH%RK$RxPXan)i+76_uR!F#7l(cu z7#04z!$`YAA`3dVYZ