From d0743eca3078f1e8e6fefe863bd566091e837aa1 Mon Sep 17 00:00:00 2001 From: leoteemo Date: Tue, 12 Sep 2023 03:33:38 -0400 Subject: [PATCH 1/6] part1 1 --- package-lock.json | 3866 +++++++++++++++++----------- src/geometry/cube.ts | 123 + src/main.ts | 21 +- src/rendering/gl/OpenGLRenderer.ts | 2 +- src/rendering/gl/ShaderProgram.ts | 9 + src/shaders/custom-frag.glsl | 0 src/shaders/custom-vert.glsl | 0 7 files changed, 2450 insertions(+), 1571 deletions(-) create mode 100644 src/geometry/cube.ts create mode 100644 src/shaders/custom-frag.glsl create mode 100644 src/shaders/custom-vert.glsl diff --git a/package-lock.json b/package-lock.json index e1a47a34..2829bfcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,628 +1,937 @@ { + "name": "hw00-intro-base", + "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" + "packages": { + "": { + "name": "hw00-intro-base", + "dependencies": { + "3d-view-controls": "^2.2.2", + "dat.gui": "^0.7.7", + "gl-matrix": "^3.3.0", + "stats-js": "^1.0.1" + }, + "devDependencies": { + "@types/dat.gui": "^0.7.7", + "@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, + "engines": { + "node": ">=10.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" + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@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==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "@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==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@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==", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, - "@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==", + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "@types/dat.gui": { + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@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 }, - "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, - "requires": { + "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "@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==", + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, - "requires": { + "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", "dev": true }, - "@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==", + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@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==", + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "dev": true }, - "@types/node": { - "version": "9.6.61", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", - "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", + "node_modules/@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, - "@types/retry": { + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "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/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "dependencies": { + "@types/node": "*" } }, - "@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==", + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, - "@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==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, - "@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==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, - "@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==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, - "@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==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, - "@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==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "requires": { + "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "requires": { + "dependencies": { "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, - "@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==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, - "@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==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "@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==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, - "@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==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "@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==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", "@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": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "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" } }, - "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 + "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" + } }, - "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 + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "peerDependencies": { + "acorn": "^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-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "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 - }, - "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 >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } }, - "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": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "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": { - "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 - }, - "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": { - "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": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, - "requires": { - "bytes": "3.1.0", + "dependencies": { + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "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", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "dependencies": { + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "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": { - "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": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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 - }, - "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.0" + } }, - "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,313 +940,310 @@ "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=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "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 + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "requires": { - "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 - } + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "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 + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "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 + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "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=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "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==" }, - "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": { - "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": { - "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" - } - }, - "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": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "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": { - "object-keys": "^1.0.12" - } - }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "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, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "engines": { + "node": ">=8" } }, - "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": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "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": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, - "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": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, - "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=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "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 + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "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": { - "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==", + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "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 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "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,782 +1253,856 @@ "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": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, - "requires": { - "accepts": "~1.3.7", + "dependencies": { + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "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": { - "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==", + "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "requires": { - "@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": ">= 0.8" } }, - "fast-json-stable-stringify": { + "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 + }, + "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": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", - "dev": true, - "requires": { - "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": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "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": { - "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 + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true + "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 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "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": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "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=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "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": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "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": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "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": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "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": { - "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 + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "requires": { - "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": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "requires": { - "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 - } + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, - "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==", + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "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": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, - "requires": { - "@types/http-proxy": "^1.17.5", + "dependencies": { + "@types/http-proxy": "^1.17.8", "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" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "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": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "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": { - "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 - }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "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": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "requires": { - "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 - } - } - }, - "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 - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "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": ">= 0.10" + } }, - "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 - }, - "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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "engines": { + "node": ">= 10" } }, - "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": { - "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": { - "has-tostringtag": "^1.0.0" - } - }, - "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 - }, - "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==", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "engines": { + "node": ">=0.10.0" } }, - "is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { - "ip-regex": "^4.0.0" + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "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 - }, - "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 - }, - "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": ">=0.12.0" + } }, - "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": { - "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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "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": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", - "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "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": { - "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==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "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" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } }, - "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": { - "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": { - "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": { - "p-defer": "^1.0.0" - } - }, - "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,780 +2110,820 @@ "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 - }, - "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "requires": { - "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": ">= 0.6" } }, - "memfs": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.4.tgz", - "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "requires": { - "fs-monkey": "1.0.3" + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "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=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "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": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "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 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "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": { - "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 + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { - "mime-db": "1.49.0" + "dependencies": { + "mime-db": "1.52.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": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "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": { - "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": { - "minimist": "^1.2.5" - } - }, - "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": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, - "requires": { - "dns-packet": "^1.3.1", + "dependencies": { + "dns-packet": "^5.2.2", "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "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": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.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": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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 - }, - "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": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "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=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "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": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "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": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "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": { - "yocto-queue": "^0.1.0" - } - }, - "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": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "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, - "requires": { - "aggregate-error": "^3.0.0" + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "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": { - "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": { - "p-finally": "^1.0.0" - } - }, - "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 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "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" - } - }, - "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": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" }, - "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 - } + "engines": { + "node": ">=8" } }, - "process-nextick-args": { + "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" } }, - "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 + "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" + } }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "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 - }, - "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": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", "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.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "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": { - "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==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "engines": { + "node": ">=0.10.0" } }, - "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=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "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 - }, - "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": { + "node": ">= 4" + } }, - "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==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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": { - "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": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "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": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, - "requires": { - "node-forge": "^0.10.0" + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { + "dependencies": { "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, - "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" + } + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "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,458 +2932,564 @@ "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": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "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.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "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" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "requires": { + "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "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": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "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==" }, - "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": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", - "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.0" - } + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "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": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "node_modules/terser": { + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dev": true, - "requires": { + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, - "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": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", - "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, - "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "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 + } } }, - "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": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "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 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "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": { - "punycode": "^2.1.0" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "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 - } + "punycode": "^2.1.0" } }, - "util-deprecate": { + "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 + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/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": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "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": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", - "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.7.1", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "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,143 +3504,347 @@ "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": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "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.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, - "requires": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, - "requires": { + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.1", - "colorette": "^1.2.2", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "del": "^6.0.0", - "express": "^4.17.1", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", - "selfsigned": "^1.10.11", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.0.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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": { - "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 + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "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=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw==", - "dev": true + "node_modules/ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "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": { - "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 } } } diff --git a/src/geometry/cube.ts b/src/geometry/cube.ts new file mode 100644 index 00000000..5fac1361 --- /dev/null +++ b/src/geometry/cube.ts @@ -0,0 +1,123 @@ +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; + size: number; + constructor(center: vec3, size: number) { + super(); + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + this.size = size; + } + + create() { + const halfSize = this.size / 2; + + this.positions = new Float32Array([ + // Front face + -0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, 0.5, 1.0, + 0.5, 0.5, 0.5, 1.0, + -0.5, 0.5, 0.5, 1.0, + + // Back face + -0.5, -0.5, -0.5, 1.0, + 0.5, -0.5, -0.5, 1.0, + 0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, -0.5, 1.0, + + // Top face + -0.5, 0.5, 0.5, 1.0, + 0.5, 0.5, 0.5, 1.0, + 0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, -0.5, 1.0, + + // Bottom face + -0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, -0.5, 1.0, + + // Right face + 0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, -0.5, 1.0, + 0.5, 0.5, -0.5, 1.0, + 0.5, 0.5, 0.5, 1.0, + + // Left face + -0.5, -0.5, 0.5, 1.0, + -0.5, -0.5, -0.5, 1.0, + -0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, 0.5, 1.0, + ]); + + this.normals = new Float32Array([ + // Front face normals + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + + // Back face normals + 0, 0, -1, 0, + 0, 0, -1, 0, + 0, 0, -1, 0, + 0, 0, -1, 0, + + // Top face normals + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + + // Bottom face normals + 0, -1, 0, 0, + 0, -1, 0, 0, + 0, -1, 0, 0, + 0, -1, 0, 0, + + // Right face normals + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0, + + // Left face normals + -1, 0, 0, 0, + -1, 0, 0, 0, + -1, 0, 0, 0, + -1, 0, 0, 0, + ]); + + this.indices = new Uint32Array([ + 0, 1, 2, 0, 2, 3, // Front face + 4, 5, 6, 4, 6, 7, // Back face + 8, 9, 10, 8, 10, 11, // Top face + 12, 13, 14, 12, 14, 15, // Bottom face + 16, 17, 18, 16, 18, 19, // Right face + 20, 21, 22, 20, 22, 23, // Left face + ]); + + 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; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 65a9461c..013303f6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import {vec3} from 'gl-matrix'; +import {vec3, vec4, mat4} from 'gl-matrix'; const Stats = require('stats-js'); import * as DAT from 'dat.gui'; import Icosphere from './geometry/Icosphere'; @@ -8,22 +8,29 @@ import Camera from './Camera'; import {setGL} from './globals'; import ShaderProgram, {Shader} from './rendering/gl/ShaderProgram'; +import Cube from './geometry/cube'; + // Define an object with application parameters and button callbacks // This will be referred to by dat.GUI's functions that add GUI elements. const controls = { tesselations: 5, 'Load Scene': loadScene, // A function pointer, essentially + color: [255.0, 0.0, 0.0], }; let icosphere: Icosphere; let square: Square; let prevTesselations: number = 5; +let cube: Cube; 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(); + + cube = new Cube(vec3.fromValues(0, 0, 0), 2); + cube.create(); } function main() { @@ -38,6 +45,7 @@ function main() { // Add controls to the gui const gui = new DAT.GUI(); gui.add(controls, 'tesselations', 0, 8).step(1); + gui.addColor(controls, 'color').onChange(updateColor); gui.add(controls, 'Load Scene'); // get canvas and webgl context @@ -64,6 +72,12 @@ function main() { new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')), ]); + function updateColor() { + const [r, g, b] = controls.color; + lambert.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1)); + + } + // This function will be called every frame function tick() { camera.update(); @@ -76,9 +90,12 @@ function main() { icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations); icosphere.create(); } + + renderer.render(camera, lambert, [ - icosphere, + //icosphere, // square, + cube, ]); stats.end(); diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts index 7e527c25..98c7a3a8 100644 --- a/src/rendering/gl/OpenGLRenderer.ts +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -31,7 +31,7 @@ class OpenGLRenderer { mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); prog.setModelMatrix(model); prog.setViewProjMatrix(viewProj); - prog.setGeometryColor(color); + //prog.setGeometryColor(color); for (let drawable of drawables) { prog.draw(drawable); diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts index 67fef40e..027d656a 100644 --- a/src/rendering/gl/ShaderProgram.ts +++ b/src/rendering/gl/ShaderProgram.ts @@ -85,6 +85,15 @@ class ShaderProgram { } } + setUniformVec4(name : string, value : vec4) + { + this.use(); + var location = gl.getUniformLocation(this.prog, name); + if (location !== -1) { + gl.uniform4fv(location, value); + } + } + draw(d: Drawable) { this.use(); diff --git a/src/shaders/custom-frag.glsl b/src/shaders/custom-frag.glsl new file mode 100644 index 00000000..e69de29b diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl new file mode 100644 index 00000000..e69de29b From 49f1a8e64c0df65b1e910853efbcbfa11d272cc3 Mon Sep 17 00:00:00 2001 From: leoteemo Date: Tue, 12 Sep 2023 23:44:47 -0400 Subject: [PATCH 2/6] ver2 --- src/.vscode/settings.json | 2 + src/main.ts | 36 ++++++++--- src/rendering/gl/ShaderProgram.ts | 10 ++++ src/shaders/custom-frag.glsl | 99 +++++++++++++++++++++++++++++++ src/shaders/custom-vert.glsl | 62 +++++++++++++++++++ src/shaders/lambert-frag.glsl | 2 + src/shaders/lambert-vert.glsl | 2 + 7 files changed, 205 insertions(+), 8 deletions(-) create mode 100644 src/.vscode/settings.json diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json new file mode 100644 index 00000000..7a73a41b --- /dev/null +++ b/src/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 013303f6..6e257a55 100644 --- a/src/main.ts +++ b/src/main.ts @@ -21,7 +21,9 @@ const controls = { let icosphere: Icosphere; let square: Square; let prevTesselations: number = 5; +let prevColor : number[] = [255.0, 0.0, 0.0]; let cube: Cube; +let time: number = 0; function loadScene() { icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations); @@ -29,7 +31,7 @@ function loadScene() { square = new Square(vec3.fromValues(0, 0, 0)); square.create(); - cube = new Cube(vec3.fromValues(0, 0, 0), 2); + cube = new Cube(vec3.fromValues(0, 0, 0), 1); cube.create(); } @@ -45,7 +47,7 @@ function main() { // Add controls to the gui const gui = new DAT.GUI(); gui.add(controls, 'tesselations', 0, 8).step(1); - gui.addColor(controls, 'color').onChange(updateColor); + gui.addColor(controls, 'color'); gui.add(controls, 'Load Scene'); // get canvas and webgl context @@ -67,14 +69,23 @@ function main() { 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 lambert = new ShaderProgram([ + // new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')), + // new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')), + // ]); + + + + const custom_shader = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/custom-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/custom-frag.glsl')), ]); + function updateColor() { const [r, g, b] = controls.color; - lambert.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1)); + //lambert.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1)); + custom_shader.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1)); } @@ -84,6 +95,7 @@ function main() { stats.begin(); gl.viewport(0, 0, window.innerWidth, window.innerHeight); renderer.clear(); + if(controls.tesselations != prevTesselations) { prevTesselations = controls.tesselations; @@ -91,8 +103,16 @@ function main() { icosphere.create(); } - - renderer.render(camera, lambert, [ + //add time + if (controls.color != prevColor) { + prevColor = controls.color; + + updateColor(); + } + + time = time + 1; + + renderer.render(camera, custom_shader, [ //icosphere, // square, cube, diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts index 027d656a..27680f3c 100644 --- a/src/rendering/gl/ShaderProgram.ts +++ b/src/rendering/gl/ShaderProgram.ts @@ -24,11 +24,13 @@ class ShaderProgram { attrPos: number; attrNor: number; attrCol: number; + //attrTime: number; unifModel: WebGLUniformLocation; unifModelInvTr: WebGLUniformLocation; unifViewProj: WebGLUniformLocation; unifColor: WebGLUniformLocation; + unifTime: WebGLUniformLocation; constructor(shaders: Array) { this.prog = gl.createProgram(); @@ -48,6 +50,7 @@ class ShaderProgram { 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"); } use() { @@ -94,6 +97,13 @@ class ShaderProgram { } } + setTime(time: number) { + this.use(); + if (this.unifTime !== -1) { + gl.uniform1f(this.unifTime, time); + } + } + draw(d: Drawable) { this.use(); diff --git a/src/shaders/custom-frag.glsl b/src/shaders/custom-frag.glsl index e69de29b..b0514523 100644 --- a/src/shaders/custom-frag.glsl +++ b/src/shaders/custom-frag.glsl @@ -0,0 +1,99 @@ +#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; + +in vec4 fs_Pos; + +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) { + return fract(sin(vec3(dot(p, vec3(127.1, 311.7, 513.3)), + dot(p, vec3(269.5, 183.3, 419.2)), + dot(p, vec3(420.6, 631.2, 937.3)) + )) * 43758.5453); +} + +float surflet(vec3 P, vec3 gridPoint) { + // Compute falloff function by converting linear distance to a polynomial + vec3 dist = abs(P - gridPoint); + vec3 t = 1.0 - 6.0 * dist * dist * dist * dist * dist + + 15.0 * dist * dist * dist * dist + - 10.0 * dist * dist * dist; + + // Get the random vector for the grid point + vec3 gradient = 2.0 * random3(gridPoint) - vec3(1.0); + + // Get the vector from the grid point to P + vec3 diff = P - gridPoint; + + // Get the value of our height field by dotting grid->P with our gradient + float height = dot(diff, gradient); + + // Scale our height field (i.e. reduce it) by our polynomial falloff function + return height * t.x * t.y * t.z; +} + +float perlinNoise(vec3 uvw) { + float surfletSum = 0.0; + + // Iterate over the eight integer corners surrounding uvw + for (int dx = 0; dx <= 1; ++dx) { + for (int dy = 0; dy <= 1; ++dy) { + for (int dz = 0; dz <= 1; ++dz) { + // Construct the grid point in 3D + vec3 gridPoint = floor(uvw) + vec3(dx, dy, dz); + + // Calculate the surflet contribution for this grid point + surfletSum += surflet(uvw, gridPoint); + } + } + } + + return surfletSum; +} + + + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + float perlinValue = 1.0 - perlinNoise(vec3(fs_Pos)/0.3); + + + // 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. + + + diffuseColor *=perlinValue; + + // Compute final shaded color + out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); +} diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl index e69de29b..a15e4706 100644 --- a/src/shaders/custom-vert.glsl +++ b/src/shaders/custom-vert.glsl @@ -0,0 +1,62 @@ +#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; + +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; + +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 pos = vec4(vec3(vs_Pos) + sin(u_Time), 1.f); + + + vec4 modelposition = u_Model * pos; // Temporarily store the transformed vertex positions for use below + + //modelposition.xyz += 0.2 * sin(u_Time) * tan(u_Time); + + 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/lambert-frag.glsl b/src/shaders/lambert-frag.glsl index 2b8e11b4..745bc9fa 100644 --- a/src/shaders/lambert-frag.glsl +++ b/src/shaders/lambert-frag.glsl @@ -22,6 +22,8 @@ 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) diff --git a/src/shaders/lambert-vert.glsl b/src/shaders/lambert-vert.glsl index 7f95a374..0748bacd 100644 --- a/src/shaders/lambert-vert.glsl +++ b/src/shaders/lambert-vert.glsl @@ -19,6 +19,8 @@ uniform mat4 u_ViewProj; // The matrix that defines the camera's transformati // 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; + 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 From c4093b440c0bb8b22f71d65faf69616de75b28d1 Mon Sep 17 00:00:00 2001 From: leoteemo Date: Wed, 13 Sep 2023 00:31:44 -0400 Subject: [PATCH 3/6] non-uniform --- src/main.ts | 5 +++-- src/shaders/custom-vert.glsl | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index 6e257a55..a356f5a8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -95,7 +95,7 @@ function main() { stats.begin(); gl.viewport(0, 0, window.innerWidth, window.innerHeight); renderer.clear(); - + if(controls.tesselations != prevTesselations) { prevTesselations = controls.tesselations; @@ -111,7 +111,8 @@ function main() { } time = time + 1; - + custom_shader.setTime(time); + renderer.render(camera, custom_shader, [ //icosphere, // square, diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl index a15e4706..fb563e0a 100644 --- a/src/shaders/custom-vert.glsl +++ b/src/shaders/custom-vert.glsl @@ -35,6 +35,32 @@ out vec4 fs_Pos; 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. +vec2 random2( vec2 p ) { + return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), + dot(p, vec2(269.5,183.3)))) + * 43758.5453); +} + +float WorleyNoise(vec2 uv) { + uv *= 10.0; // Now the space is 10x10 instead of 1x1. Change this to any number you want. + vec2 uvInt = floor(uv); + vec2 uvFract = fract(uv); + float minDist = 1.0; // Minimum distance initialized to max. + for(int y = -1; y <= 1; ++y) { + for(int x = -1; x <= 1; ++x) { + vec2 neighbor = vec2(float(x), float(y)); // Direction in which neighbor cell lies + vec2 point = random2(uvInt + neighbor); // Get the Voronoi centerpoint for the neighboring cell + vec2 diff = neighbor + point - uvFract; // Distance between fragment coord and neighbor’s Voronoi point + float dist = length(diff); + minDist = min(minDist, dist); + } + } + return minDist; +} + + + + void main() { fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation @@ -46,12 +72,17 @@ void main() // perpendicular to the surface after the surface is transformed by // the model matrix. - vec4 pos = vec4(vec3(vs_Pos) + sin(u_Time), 1.f); + + vec4 pos = vs_Pos; + //pos += vec4( vec3(pos) + 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) +0.5 , cos(u_Time/150.0))) , 0.f); vec4 modelposition = u_Model * pos; // Temporarily store the transformed vertex positions for use below - //modelposition.xyz += 0.2 * sin(u_Time) * tan(u_Time); + modelposition.x += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) + modelposition.x , cos(u_Time/150.0))); + modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + + modelposition.y )); + + modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0); fs_Pos = modelposition; From d3fb9c26e2ec49f5a41d9aeebcf9e0fa47998807 Mon Sep 17 00:00:00 2001 From: leoteemo Date: Wed, 13 Sep 2023 00:39:01 -0400 Subject: [PATCH 4/6] commit --- src/shaders/custom-vert.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl index fb563e0a..d4589908 100644 --- a/src/shaders/custom-vert.glsl +++ b/src/shaders/custom-vert.glsl @@ -80,7 +80,7 @@ void main() vec4 modelposition = u_Model * pos; // Temporarily store the transformed vertex positions for use below modelposition.x += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) + modelposition.x , cos(u_Time/150.0))); - modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + + modelposition.y )); + modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + modelposition.y )); modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0); From 028cf7ab040edc5be6c64e9d1462dd2f7770af77 Mon Sep 17 00:00:00 2001 From: leoteemo Date: Wed, 13 Sep 2023 00:48:01 -0400 Subject: [PATCH 5/6] readme --- README.md | 9 +++++---- pic0.png | Bin 0 -> 80597 bytes pic1.png | Bin 0 -> 78127 bytes src/shaders/custom-vert.glsl | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 pic0.png create mode 100644 pic1.png diff --git a/README.md b/README.md index b898cbb4..39b47b7c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # HW 0: Intro to Javascript and WebGL -

- -

-

(source: Ken Perlin)

+## ReadMe +- I made toggle to change color on the cointrols +- I created a custom vert shader with Perlin noise, and a custom frag shader use trig functions. +![](pic0.png) +![](pic1.png) ## Objective - Check that the tools and build configuration we will be using for the class works. - Start learning Typescript and WebGL2 diff --git a/pic0.png b/pic0.png new file mode 100644 index 0000000000000000000000000000000000000000..5050a8d5ace16ee4303475ad65b7a96118442b4c GIT binary patch literal 80597 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 szJF&Vw-}q(z6cAQBz&qkVB|Zi>CY! z{wzpSA5vv?FdHH!u90KZShYJWxwO!{$u?}LN#(jlzE-HIa=NRXW^HJKVJ1LaKKxbn z)?D5m;vb+{b^3L>57eiIt!hF)Q?o=&PBrGf8(bj*izds7CO!l|i$=;PW6Z?c!qVEA zKf(JbMY7z389m8ILB)}b`wwdD)(lkW=xBX|gtREjj_GHBlkzY>4^2-(c?B4BH4z-N zrXhIXz(20ol~*TbdEwl%AUp@;=6Fj;%zN`quZDI#JKZl}Y)E**d4%$l0Lk-P$d2O#9oWnVuGZ-uuxYHWUKvoB+Q^$usUF32K^-# zG+0SdzhlGP?Y8Ku8hsAyKBr3bV|9X2OQr<+t4%P00ueh_l+G5PS^>K$WSkHe#~spX zyij%_{(wQNU!#R+Lni{P%gfU{5c;6TbJBM@PgPy!C1u;&Z&OS%0)TYop@PMz>xBy+ zpb!`^9aK;Xujgd(P?0X(7iO{?D>S9ecMljnv9)5ld;!84??%q1`KmZtvBEPne8^<~ z`?!cJx<4{3_3jzyz_9C;inUA+L7E*`^Ld5h`sKSz~^2H6%u zZB(cbdG=VGdcOl9V%8hEP?Jgs89i^b(LKM^xWKy97&p0&a~p`xKBRLmeCc{gR%kBI z&q-(J@8>cic*#-It@;H+8iYNypspE`G$@33%{kg!C(;|4$G>qF8L z!uppCU;zwtT;m&-JKpodJ)%7AdzadbUvHCe+Y{|TH3j8`#@3>x=$8_{~`#N37C(9#3HgJu#ZUEiF zm56RA2lS1c8Do(QELiUh0@^?1E-3+0Q?t&CZV>Y&x1y@opw?_pH=lDi?-D^a9DTPh zHiV!7>X9#ba!#EdsP#$vb5eE=a|>IIK_Ol`dJJ-VcrxabvlRekjyqp$$(c%O%7PbDT*} z>YGA|arw>6+5~n*3a4g?(0m5WQgoZuuw4(*9M-@mSFRg#oF(;gqY0?-e%MGI5^|(X zF`uP*5h?aM^^`{^OPR39XB%-hbj6+27;q^9ox?zIa(bz0Zi&P{)wje^<3g7M7dter zj(qQ2a|W1R<{Wn`W?1zxMg^+aBXt|JC0~NXq%ZYm)~06Km6i{C|6U5uLaBb=&1gX& z=fIV%4UJkJoZ}7> z$=~^(L8clc=wVuOk+>#wvxF0AKb(EUZTgDGNo2)TK%{7C(;${`Rqf)n>XuY+L#Pc1 zlncmqfU%j{n~P?b9$v~j9N z` zM_%t6-=r*YTF5w~c{X6{RWD&~1T%>=b&7#grwpS^_WJloNweOV1@KZ7Isdh2$k$2P zj_en(kzN;gB<WUP2L zq`9=Q>eg`ni;+#DzwOL8@U0X%>R;HZ6>B!TwJTAk;Q2p;V2QRn@&7-=82?tU%Z~k= z;rf&to94CW(|8Q;_eYH3;Ru~-JM8{$60kXwMka%}^-XjnB62M|Y+28PhY*a+&%2f^ zX$&0_-g(+eQT;usdCzN6biQf)r2|INmAKx*hf9hAh```cJ zHxJhMzkh-CFt2qZd0uYpvS}+{^+P#_xhn(u-G1(F9VjYT^(y>kwhG^(^bQU89c;Nb z$7+3Yy&9(n2e0sXv)(A+mBSanZgsF%*2)0b$E9$B@pd_Q{87uVyb^bZCy&S82Q0ML z`%I14gtTtjR6R60K1ci$-tZ{bYwP>PGtRsC{C3v%xbx))4$?2 z7L15l#ry#RsKHnY#Yr9y>J2D9SHGMo#49r}u}%Q2TX7F9n_PD2nA?exYXuqh{D~VO zsth@2Y$mG`AYUlOsvM>bTJo*T|LZBg0PbY2KRMY@=)`Obu@_}G^@LbiVxw#I=V+b- zXxK^GliOj*d{sjpbf@;yDkXqh-=BhPa^)p6OEbIXgUS^nzUN&V`Q!B=@46BXcE?Fs ztX>LLjdqyZn8hmg=_*@@Q0Zjw(Br%~@3O_t$^)qE8zJE8Q`IKp)S%u7P!j8n^@ zF4+mB9~ERyF82r}6F|sBFN9`+j7R*N%8B(hF2s#pS(EP`N3cTXq;10179PFLs{1Zg zLjVx0^nZUNaUxV(dtI}GhWR3r@0M$$(w=%%saU*q0K&&nbmH;O9GVcqg%3WCJ-j;hNg@OBf;l z<)LCDk@=V1Udfha1Bl?g94Q%o!e~T%qW|ZCv-ZUx)?kfi22#Zh4LQ5yLOv+sPxqtM zsZ5v>`pO%*FJE1Gl>NsA9l4FqFJijPjo7_I2|iCGPln@*u!MDHvXyQPu>ATs3`;l; zW4YiwO6|KWwG&tCnSiBgySMAllR6m-$Kc!#DZ+T9ff}J&Al0t9PGl4Hw#$#VK z*4k;@8;ngR<_I>~sRU@uxz}sEy_xfra&K71koDd3p6lV7OkWqwQpWfm|N8V_EWnK& zAK=$&a7oCuOd1zAG4mNO^bdR+dr|T*uXXK^-0Lzs+Se`EZ#-}SQG2#=gIQ8TZ$zA_ zz2Wja@AE!U<{SOj?}J*gFVCMZ7&@@umR3i#Dx`k(sm>0aP73WR<;ZzfddRan!>3F| z$B;028_1xU|8!E{Kn5$Jm+$dkf9~LZXd+`7YYG2`7wL3M`;hu@e68#X8k5>kZjdX9 zTIlt*y7sHa!sJHRe&ig!FDcrZY-|U4<~4E&&Z*<|ePL;yfSN|<(q&HekIqb|()4Fi zwjWymq~dsyK@;QXm{{*bUiqPu@OM;R$27ivwGUt*-Qb($wUM4Rc(o4`GUWG>dT&ma zHohUqTpIj^Z~v};^jj3Ku{(!le?Tn9jJv=qmEb=3{5ZfDa_>N4_(ComM|Ps5l{a|A zfsYC8nwcY>(6O(*QgWtwtDYDUSVA>jjKdh9x}7rDc8$5hWI@wey#ch7UYU@WwqQ*w z(EG$lzgk@@bbb|#TCQeW8qiR#S~$l(p*ler_kyW3gc=vxl?7!sw)D<9IXvg*yL?2R zrD=M)4*wHgr;$Sjeoi{`(K9_15PHb@S}d(tA(|#a0ufmlWgVr_h>;Uns~l@h+9Y&{ zWxVKFM~k8c+(JI%!eQUw2u&5~x4boMX(o?9WLY^A#@VA0tu&RDwlsHx8EbY{NgRg; z33bDL@fxC0)J~t5x)f37M@#c9Y~R?Fu2(YxA4MC%YH0x~Oze-siM;4nGJc)!E#k*? z^Kz9#>u*^B*n1~Vp8UtF>fm_8*Srz)=jvG%_w_IQ9Y_BU9ff}j#XEBOKeZtKdoI`> zDcOgR`_U`%U^8hyX6AX+S4f6GAScs$a-wPR9jLorC4hW+zQ>WC{{C|RX@=wPCbU|; zSJUP!ubs4Lge|wvaBl#}JN)(L?hYgVZ-w*wpQ4b#o4(SB4vdz29`dghM-NbmmVNyG z8%l^}KTy3S0Fzh~tR%g4_JmFKU~f>(;{IXvohZ(C>}|(~e4C~%G;^^d9&a6=Av5Gr z!XHayl_80FiJV(DVzq-4T%8Eu*j&VbGvZy=qY>%Fx0KCH1t5dvwkhdTuMwJ@Me!OD zsR-L~YrGlw);L;vw->e}-o;}E={?9{QDBqt^##_2aSG#Q2B0cQ6%N$5H4c<(;5}Xx z?`>V|G5)5HFlmG4K5dkH864iH-2fhP0PDwxN|01>CV?f85 zG>1F82U#ry=%7t-Ucj6H%Ek+00KAH3d`>>Bt7xKqh$alt)@U;kO92PU8<{#Kapng^ z+{R+P7jCn}^KlS0WJ6-Ju@0JK0|r(aH?ypUt`pnqQq6!gPpj;>n#5vYl{+|ZD_kk4 zp+IXUAdt?|MR;g1_6;Zhi-C`=NV$cGRFqwz!FX1Byg(OMt#lZdRWkS9XC#VNGh??jJtj= z)XIHfZMBpZV=!JsL@Q)%s`bhnhXhn1**O|!W4*oSnuMkp>!kSXvy}^1T?qAvd0Ei8 zEDkPkSrJrXfar$BEcpR(r}SQIj!NAJ>{un=_kLV(y#TeB5w?6cz*B1|g%XigzO|78 z!3n}bioM2zQI^ED9AA|JMWC(gSma4s9V56f{5EBCT{{c%GV$qWGll%(g7QstZSoaU z$6Ohex*|jJ`e{h3&~6xS1n%9p+)Cz^&0->ht=wlv39ZSh$!Z|b>K;m!EsZd5X%G#X zj=vUC^T}%qXtsTaCE2T-KDSSU#bQg|QDMJ$G|QY=@(G!n^(z;x z;cW6}nVh6>?&{txQyMn*Ekw=NHyZ1V%^@HJL45685q+rJjDCGNEbMY0X}c1se}YZkiixjvdGfQp=3!^0CQ* z*KdM2b*!<2BG7xpk2HYN2QK0IWHBM6k32Z%S3Yt|@0AVu+P+*EYrVBAOm6b`R~oEP zMl;z`>LCbMPC2^bx)We|;$^IIF=)#&rD>91P)D?giPbpuF7usI)}V~tX19(TSJ6JV z$Dt&D%j-AFD@0(M6>dh!wiImCzrdm&u&=wCStnqt9^@Sn{)Fauu#ajNQTGfapTmwZ$6xNL?feo1SvtQPyjKSdSPmG_=v2D6<+dF4BS1Ou(vLXG$18&cZ zMj4^@%FepNg1FIVz12=-nP*l@3uSYe`QPfuST|0NMOkI9h1)E~tt z$`m&~ub;Gsk_JTJ*b$z!ZPwxJ=;a&lcx<&=NMUv(JO?|r{dX5z1{Vgi)q6S|2&>f! z+{(B_0arLR`(;^rHfg7Q)qmsPNIvI1D4(&kak3PK3?9p`C*5K-icZ}oMGiG+;5PNY zBt8=q#L0z~l%2K5@zPBTC9m3M^)CCr{$YxODj@lI;__{kTF@de|i3uwi^rp~~n z%KJ|;h#<-7-nA=Gvz#^LVF%_1LDIie@ObTPV)SZ9RA0EezqNWX8i9%UjL&S|DziJqZ&IE z`+skYyK)zNur$Bj-Cfg&e8Y(Jhtd3tyS?*#w#~YcC){}L1wOt+i=Soifx(xSt_=xT zcKd$hJp{%+G&$mZknJWJUt)H9twrd>_PJt&pJ`>Vxf~L4K33A*wo+U0NFOeBQVx6x zn9GVCKq8g21n0FvbvwxpZ~?u2vf{77g;qA3yFJ28@j|>?JnlU6GxrHBMMVu_&dA5* zpDu`F%bT1kiH<9DZ49m#yO3Q9Z#M`4t@_m$1|w1PGpFyZR%Dm!i5@D5dhPCxr4P{Y zCQOqh=X#KAzk+C?8+>0(B1(JmuWb_59{vOjDr|d>u-w8}h5k^MQruJkC@d@DTWHm? zJNu)8NMYpjcKT#-x{N>tJWjv5Aua9{7>rOivh|Q1P)FiC?D_^@3RHuC+%NU#{Z^dZ zaP)pdNXmIKpkF}!o*)vIW7K2j52BvK<3pRoT*X~h4dZJP`6VtFtUrI1=j#5>=7d?! zX@Y^i{u{m6K*?LXCA3SA4VYKz6JnkGn~et(*G<6#0|TxHwjY!D>rW{xn(JO3?9A(E zy0l<0R4!{(~>MQ3F%@$WBo){K^i?`aK_36Cw>yMAlw8^A-GMX1-J$3%hm@}7C$TkA(u z|71KA#jpxn*X?;J=22-W6bCHXs{^$VJdjnsmv&g){8Z^)o4#)-Z1SLt`=u?->+ZLO zvu{+ae4OQy`h}b`B(M6uZpnY36;Q3!AKUL`^VPK;4HI+K)L|f@#Ng- zvi+LT*Tvjo`p1>0;2~|(1BEMXkpT9au8+%KUh21;IV&5g13EJHCHBL;sJ=5pms4GJ zd}_tq5kskTJ*Ek(9dB7?4BH-wtf)Et12Iv z`kRfB9M-*ag-TnQ??%E`&%~3h<7*;prg{op312TQy}c}V^_)@9puGCP-BR_uGiNVp zFEw8?4OYKn>=9`ENSY1=(_&3BD*6^=uqm2PQX0v1UxiIAVr zt6Ess(%YLRRJPxeSybQtNX3Nap7frAj?PYG1e;m0-C+FWG~n;^zQF%|0rHkS%cTHy zO9)vw0u^mLbZF^J;CfA56#j%+slBzm`{tj~ax-Qo*1=EzLNQR+HviBD1cw>l$$N08 zC;5+*Yq~KpZ{O)U$F7`Nev|ik;8tWn9q^(V`k~d}H-UrXn{d}~VE00edo^kVyDcE= zqW@4E{7}iqoh1dSZUw`*E(o~z_gsO=`Df?c-NZeJlGQaH2J&!=iR+@-Z!3_egT4pE z-DTuGlRVY2=R&_>Rq7qx$J42?;x2YcT+5Pd|U& z+k;Fgx|#x1AMbJNbp941Wk44-3?4+9Z*tc?k82sP#ikrLcK`4jR|`PyhN zFy;~4A>KW?BbMTtwEXQZOH4i%95_2b58;u(_w45@8P?y!{qHnbn`5Vr0QS0d>6kue z7!9`S#`?f5GE=`K|CW*@=%B2ntnZkB`Z#{^VM@6T*JtJztyI4wGJ|Hf-@Vn!R3fu2`ai>e$&T99_RDF9?sg>I;d~AE(g6GgaqdHETxfn=0v-(>IudrgAFL7 z4ALu89cb}GF7=nF=;i}qpB=4B!mN3#)mZ=YIhf3K{&q42XXZa7?iTzZ7gT$XR{g3E zJ^HByH*txLcKcUZ@A@YcpmWPMh%q^x`E-Xi&Wo8&l9d2zpp>%;la6+eLZ zXLH;iW7hX?;E@pdd(e{e?f`yD*05b>2@7B7?niA8eZP4?{hNyA6g*eHpB`jh_RW7{ zKyxYgVP&FCd(q_Yd!Tc-^=;n7#AP;q7G-7g>C)Ugp}qXUBPackeTrMu5b?U@q@H^S znFm9H3|opg)#S+P6tM40+})_W$dq`8;>yHW=02o$cEP)T-f;VRh`WHO1K407dz)hi zo^lJfxybwYP0_(eQb=1GaoN^8`elVRE zsUsGU)Dn5<7_g&VdFYa}d`Zj;ci#{A<%wAvPK-s+DCE1^r?c9Py4>TXJ`f9C_d(%e zdH)v$IxxhS{xtW{>DrYaNR1kEOEG+#PYrqvDD#2ayeK3e-iVU55qIpIkIA_n9y%Q? zuY)a8_t$;l=$h|-n^l5cIksPKAHe2-;9OfI8zc5wI6HVH>8P@D(uee~y0WlkeNX?P z+kmDNz4@NRq4Ij_sZSCnV;Z=yZk@8wTk0jZ&$sMSJAEkm@KT@ytXlP9&DU0f%EXeE zjf=BM%`uZwl;QRGRypNrOVz0C{Nfy^!7|bNtmFLA+fuBU`-wk98~`6I&d)!cj%3T* zt17jbvvrN+5_oaT2Y+=dd}-xDWc&1d+|VhFuE}C|LD9^D^Ifvf6Ao!x9B4mAKW3b- zm1|N2G{}|i%8QgdQH2qR@zscF={&$@{Vl5#s{`je`|OK1BE!EC0`32xd$wd zPDGkj+kmC~99z=Vm6Ki{8Mho!h}P^bW}3-eUB4XX;!(0{-ZN;0uM*p@vn|{TmmOlS z+muK9mvta51qY1>A@PdtRqgECF7p#B#<5c^tc#5jY8+?iA=ZS^=B@ct@&G&kf+w*9 zw}#}djs7knt;QQs)3yu7+yVn`ysF%B+vSZbI|+3#D8p{+}vA?1(I zGZL>gj(FJ=?r{o$l8=WLg;b*y1u+Tq zOGYTcL4OZ%qnfm$5ukZs`rHF8^EXw;+aE+qN?bPmaOSLZ6#7k6w3=hf8LWEcM6R?= ziG|SN(-)J{{63!1aWC~cc~}%ae48?t+M0Y!Ih5cxW`Uzcb?1}qYYfBTSl7X1Is30f_*Z@Fn;nm5-k^gB#~j- zU`NL@TUIv)BErOZ)2=&{XWv)z;10+*EoXE}!LIa6+3#2B{l!hDQ}DujJ$88C=xL9bE9?vR&bY9-w$?z zBEqGr2twkO-EA@oXMv4|NrkAjMZIR)i~_i!Q>%W?63-UsYZudRyb}iG+%0>_Ai9%I zwMYTeh!y;QO$a z7F=O3^&4n>%m)~lUNbfS@@++h>%B37l;oohCnP+mCVL_iWqyy@54bV>SJy9E`O7h} z<@9PW(27wH4~kG(eG>>ol*kZ5f>vinQKg}})^gHnyOO#xU;h3jHnV6Y)Y%?L2VdUO znmK**!CZ=vR>(dXLPg`8#SFU!y2XjEcZpwAb8pX!ie<@{7^ys(-*02eMQohrt&mSs z;YVf=Jeq!yKJ>unQIR6jP^kU1CG|^6V>Uj{*)3ySVCh>%c8hAK-*MG$HiC(EQZpn^ z%XS&lGHX{9D3=8#WKHMl5_?y2gXcn)HDy(Mq}5FN_3YYal)xsuPgkv-K~(iUZ_~;= zQEYf8`0yEA_q5if25r0Pe&MEGiOhQ&Agfw;^->uYoRmUn9KDA&RI}zqFn3!SIQ;Se zvk`1f=ed^irq&+H_2;U4njUYJCmFjrc=)1$878^I1^Mw5H#fE_zK{bxh(nEtI#q86 z(Uqwm$=2h}#)Tt*$P>aS&xx29tByz{wybHpSh|HCAOM%z=%E_{%KY{?;qlX6&hzcY zqSM7f>V{h8j3A>8)r*s17j8|S8FV@LwF3<9GNLwD0D1dFgWQ z-M#;dsrQU(GTq*XXB^K_L}8F7NEvFVA}A_^zzju-^d=nv5h($s1PIM>Ksrc~o*=z< z2sPjYkfwy*0?CA8fB*?41PJAQnDhIu_4+vVEVwfCcQEti%~Mbl2l#D(IP zQLCff%Om`D?O*6ey zCUSI3FFL5?0ou~D%9}V8d$hcj)jY@)Z&f$Yr}caSgNeAK_Q@kU*w7|&oXcSWSfemV zUL8}&qiwe;`XO_>@KrvYyw4KIYNT$JoyI-=QY*Wd3M5diB?=LEBYEVHMVkHYv;D!! z5!a>g^w=AMuH#|(BgI-Yr32~Sa8n*2GTzzx8Yiq0B-A1DY%3HNm zBt}bIXoXch^~|k-hAdpt9KY258@GRP`KsUWFd?1FvWnuWu->{`8kjSoXE0b6QfbSu z%KA}JafW#$uawfe*0}H|BG^_;T^p6zuCWOI;x_=7In!79Lq6}RRUfdV(qb*81q?fv z{986c!wVMc7WG8G32dEGmKYbyLU^w45NX0~5A<|7 zEY>vC53=TW2ReEMqa#KQ8{v#f+VP&P(sQ0o7+ZM0o0ya-y6XZRz6!a0Pv)+@ zzF}kv#JTMPvjc2g!8sCwFNm&#|2fFB(XncVyfukuiof58A^13HH)~jyMaEHD28V83 z*sF;v_%4;j?X5yH}yoNi1hW-<|W3lE{of@DwE0Wa?>6bNMY?naUqT{#}8J#}NNw`eEsFWyHv+ zS9~MBj$K8oyw%w{n56E;Tb@^5J{3)Viw4PhwLgHE>sie?ERPhRe+(p?`m5|cYeQFe z&kBp*GxZgoGP4aD&?otmf` z1~&>;sw`}sRS8fIF$Xtmpcgg}VaO5;pDY-2sHpc3!rk0+KRkpT`e`5D_T2}Kq^4_pvWmjE0GShEK zxO#sZGI2%|w)m?ZAg}q%)Zr}_lHc@%{Y?(<@w4@io3*u81;u4bo*NuEatZ#C{?V0 zxVo<`g{ET@Sn4TcUP!T5P#LNhI+&u(O(jjZO`Ik&8Yi@qN2QD*#^rG0Z~8X<>!7jzlgRqXLja-> zd#Z7}h&`Swc)8FCrz;{NIq!tK$?(++zZu;Z<@jeZSB!|(u!%@;yZ)=<4sF~>UUPlr zzQXL1T|g$qo@Ex7(d*Nr-6qL(o(I^k^KX#jkNFWk5E;5R35)B+ZT*<1*X%>6BpS0-Gk{0E zi<0y|WvwW6uL$mWc&1T7d#COeECK?3kX2D4^3NWUx2vy4ZI?L)`S@OEn83nAR+BdM zmW7j>*H2zp+8<&E;5y1y*=5ihX7_{Ve9Q3GKs+$(qF$tYqqpp@N*vN}xsaviq*b#%JZl1Q^+@2E1iFk+ryypD}#zfjAI4Ie}*H3IUD+sg?a@ z5E{PrHQxMIB@HpuIvE@`S}$l%1npp@)H?GLsDre;kAvhY+G+d2>Bvhh`1v&DonW0x zO692U;!CRD^D-iu6K^Rd?WSuIV&b-FMN9dO+{Gr zL%+J|0ccdsmY(q(Y?_Ltq1Fz&ye$DIiNNFC?KkQV6FZbEAdPrfaz|WYMk?o94z19h z$jsxV+gvkT1UVwDjjuHs@H?a0wn3OecGw5Wp?`?6%z|Pm>}>MO9HzZ6rUJgk2~~Eo zye`|YaoqqL-^`EJhu!-^S~}*d9hu#Ew>hS-J}qbH{+pcD+7PnwIHl+5*irJKh?<7c zizqiY?k%Po1*P%3-J@yj6*sZUpN`uZ^xw3zo9hQ@r)aA1Ag7T+|7*{RSDV_e2gdvq z6;EZp-&8Z${`w~XFK=ZW?OsBVM?Q1F&oA%O%QSAF7o9o^G9ETr=X6gF8_cL$AM(?0 zU2NHnI8bi+uzCrB?)icOo-aMtFUkKLfeO?n_K}55*it!x6S~c@;W}r~nP-(O*PA3F z=ap-`Ksrr@M&K_5)41jB<~j+2I1FRM&zum*R+@ApHdf`fh?oSXJPyuVF@CH+`%ikk z*Qbw8F#`!q%yl92Ak2fxnVQYY&cTzGW8#myuv#HFIjlE)m6XBGG5xZ?no6=u^nd3o z=&sZnHNm<{3mQAfg7;Mv+VpCByc%a#Y&sxKIrt|ahJSX40PCY3{pc~dOs1Jlk4E-S zOs6+BDyMz5kBX;4jdQx6<#cH0%zJE`rPj%T%cV^$p!<}5u+Sj>LqzVMMx>7eQZU(50bGUZ;+~w}vv~KB^-c9Ya zz;$`gat?Ppsi_}56*%YHo?wtG)?r5^F{ofcF4qa+*_8)3GWlw;ta!=z1*<#u zmH09GPfo7B>BeI5-e=_;LUC-fSJHK*$760tHr+Y%R-MBb%dUW5qT1&pF>= zVkRjI>gd!j*InIm^O_|b=b&np?LW=x+7-Y2D+(mQo7fR5`cw%n+|s{Zjm42(MrEc5 zmXKbo{av+v?j@tH(c-Z5brs&SokE?g{6L11Z#}N^R`Y!?1f=Y~h59doirx5To)>zN zRY-=AP&1dg3{SEF#H@}8vmZEgP=g)G20TE!?DA8VX>v@uI?nprL-eXr=32=+-UMHJ+ zS%3$YMiug@ij*YN`I9ZaWW_Pmdp0L-79PJP~;buB_%`7_zBKI6OvJ*@y0ZCPwq&%+ic9`zWTXVsJ zfW5_2wO2|mB=RlbD0B)A{SDi?I74m{Nsio=VAmIbsq}p7@&ea?r<*k#1u3#DelGaM zvE=KV6AIVgecA6X$ZnTVdTFZvBMC#6B^{2nFK%k;*nHF3*0t4-jj#AV@vW^zF>ED? zIxm3Fzy(^j3Kp2*z}2K9GQ*heSck@Mw6UZpw`fcVC!na2e`$e1LVM+L9#@JMyiIuA ziQCBX7)Dih9*)Hf>HlQ+&4uqg_)2dt1sVvE!zG)R2rPvC)i%e*A~5ns80IU~{*rA0 zGdxHRR+_CEuX41V2@#lHv!l%Z=yJGcTapuV9V-u+w8lQ34YQ9k#xkf1#qZ&%oE0}` z&2(SS1y+{Jwbae9n>&W4f5_<36uEX<{UNg!wRCh2tn}T$wQvTIAbxrOBkYUQLLoJ` zD)3#ab9uI&BkJVfY-06QyrA`DQuF94%Z8n0ux&t?51RK}L=@zU5!PDoGTgRDEI8N{ zvz*TbZx4OQ3Zh18=-U(*Yl@i=UAqCH9ol_w7w&+p3hVx%+~UEg-E=)-jqnB@=j4O$SjF^D&{xy4 zrVuseWW#0QPpBwu!$)hYX-4eRR)<#-w=QlcZqfOswOK8~R(}G2lE+;ZQ-i#KMuz{M zqcm`i8?ovGfg{6w$Y!0(6QG)KrP-EbL(kvZK96lb>h_zrt^0669bNzUdC)}H`~dbQ zI*GiaAbM|@#lz@H->Mc^|1Rh3C*7M>kqQ8!S12r|>eV~yW>y^bm4%xAr9Q@47LWDt z#o(j@aN=E)ml)6Llqt$ow(U$7Lu z>Xsp*f;}jxzc<}`5>6YwenYNC3?#116sNZ|;(>0kqm>M}=Y!DJE=Er*dKoIyEEL9N z1xKLsD3KfZG9v@)2Uuw8_PX&Z9m1KxaS{>v{i_*ImJ1bKx4Sb{E4T3jc@|{ro#;cs zf_>%WMxEIBkLBwXq*3qWsiE!Yt**&J32^O-zmfZ@X3VfeT)pb7G%gaJ(3U^yxJ!4? z0GSXgu7iuxKT{{pxpA1VLns>El&HP%HsQ;Nz2@AEp^WIgtw@carCIByXSt(1wT>Y@ zS@HQ1mNlJSi#P#Z8BG6kVHt|PL;mpa;hJpq)W}sW35XLX!Fu9eXij-pNs7kQ9O=$2 z3Y{-eCgRTz8K=#g8Z(#536=jIM<`ypQ0AP#V|ZT@ZR(i6G;)t>NVO}?3bx8wklLOT zHBb|65idd2?bj|Bn=Vy^zIi@lcBK%wi0gVbM<*W3!VyozWrtsCNq}SH6}ncGL84ym z`sP+k+O|O1cyS(@LMN9vdeD6Bx4`sqDTJn`zUkD|>%Ku+R(%Xxnx<0dKzRKdj`(7- zRrf~}mZ{VuRkD?oc3`kaLT}YP$Jw>0IuaMsJeJnh@P{(^w%{D{s+VB*-T0t+rS^1; z1exY$8s`r7JZ?NDAYF$ z+8Aj^mjM~*#`{-BJRG;V-IYW|P0{-L2cB}X{a2sP|LmQzb~Q>+OrQRe)`5rzy;Bhy zua9dD;UPE3YIl)P`?clGYmrZ_f22{@POG~hv-?eY+ud>mRf`dO(n%=Bg1k?pi!Np& zt~0g({B9?4hxs!94QPu#Rx19b^wZkR;kd$E*IP<|aF+ddADsx)2I_f79Eyp*IFuH+ zVojk(@9L$2wf@t9x$tBH{$lm<#;q#rEtfUp^@BwIo~RmX647HIP_b)CSXAMaR}#|pr_S0_6GE;Q-TL!4x4mT>3_*o+DHcI8;YDsnahZ@yYC@POk zdqdbqf2XTLu2ITaY34t+JA~B)L&SxAA(_G8i!Q+t7>U^Voz{+_c~TO+YT=oi*JLpU z-)Em!M6-XR8Fms#RKzX1s@h*W@VUkKdd6r>{HYfJ^aMrg+SfRn*DNS-ifHRRLsp!0 zW1olRyUl4Rk99l5FOLG-@D81I!F@^IsQ<0yGEu(G=@H3-KT>#2Su^1O$4N9QFz7i@ z3^yeO?&$kKGsPe4n$dM9Sr_)2Yv?RLZVv7En*2yX0vM|900j^=V zj9*Yl!pG)%R91O?y;1+Rivmy;8Q5JSO^kjCk9-+5jZTP-gXpTTX%RA&%U<`t za{FP}6y!5QQ}f<@lkC^Sj9pPvu~0p^LSY-83Y%=>IJxSjWGp^~V+6fyVJ zp3q=N_p5by?i~;G&IFqD@TdL0foGXVC(^;<_k0^AKyvCj@dh;c=S)*>4of{SUn zHO}#SilWCh!_R}V-{g_3G7mIIy$q;d$T{~2{~KAS(eE;1u23QqDGlWVhIp!Nb>JP6 zp-X)2=w8DCZtF~7<$`ryNWNJ*WE?{K6-6G?MdIu| zSk?9)In;O&TJj};cIMok1Jm6c;C{10VgKTg=wQH>K$1$StD1oEh^$9x72T5Mb${(& z>`mNmgk9L-4&CX2mdlu4O3$Y?iMV0Ejkqp+p{E+MJgad~m)YoEaP}<2ZL*2R_=jHN zxT;O?K}3@)ZN)+zD+$tdWrKu<%|O{{NGv-$=Ud*IUtz3%%g#Yh5?|_$5P2d=MC<^& z&Tgl@>f;NivK5y&yC((=w$k`UvxClW{f^u{k|4GZ;vGKEP*bEf86U8h zej+4|nhyuQU({C-d%-tENnve7xkxd zGSpd85duwvHpu#ijzCZTFP zxB~+o^qUaYr$5X~4ENbtwznd+K9b%SgtDedXlDkMn_ZJIN-X`LXd&<>l+M z4&vfo772Pwqa~996#Mm?b%Ey-gt9+*4>vx4Ko{9dx;r@q80oEE1z!IpHucD(VKCFv zHOyZ$sqOVt?xFq`GCERS?}>k6oR01Xs$G|CrqZ4poSh@>(?oB+SrUK6H}an9L_^1I z9<&pE>Dfh6By=+P0NIr9reg_!I17(NrDQ(vYAFeeB^mC9WbL?G88XG2!*1W*g$NPt zg*LMN(d5E}BQ%yNfyJ@>({VPeLFWPOFGZ!jD+V&k)@i*1RTkjiye~`WTmSi&fCm6q zhI5uxH7c^{q+cp^nIjy32MMJpr;Siicq+^0ROj7{vaO<(i7CXyYJ~0sx)kgk$q-8D zc0Aab?Oo_hy%RpFRM`Q~do~@ZSsi$rC73%ncN1lS&rw@p+xc|%RS=(R{6P+QXj`Jm z{G|3Gh`3~EWE4nJ9Tn z)h7zmx(1=g-2?7L&R0alWtaU;oK~Z>j=xoZue1k(Bg|y0S<^+Av`3N0G{8s-ZxjEJ zG}}k@Q&c+eSMB^eKLN!r!|N;uT#w!>`}pNWWh~+`@BU zT~wkgPg*KAL18F`od-RXz%ktclH3Yae=nR2psKTD<=ikz+=2Su!&Kp^N#9CRpQd$P zhAYI7nbTp6f7s)wBfaf97R!ETm+-UE3xDL>gzA!#9B;l7ehuvSVFAgbFg(4K9Bl=r zpf2|d^FJ0KvuTr6^~R6Fhhqi&jB|sX&$Q8n`%#9yyd#n7V!_7Zzxr-4MdoQzBh?jS zUv&9}oZNHYWK4WpLa98z7I+>X60dS*ygq0+z><>0nPd;KTnnt8Ub=)!OEKUW?X6V!EC9&PG8lE6V@sZX~d9~oW>dY z`+hW1Rw_q;GfU^7A!+b!}h&2fL(j>bEN^` zdoDaY{?}OQ|CQQbd=$@NY!+nq`d=L69AvHq9Q!}{lT+2eylLLD$>MeC2Ic+ha$}83 zR@{FzP>G)u<;;#cassE|#b=RM--EbS3W!5dr8T@w2AK=@GHk2szeAP0^3}{fvHz;X z<78qGlRl|&EWh_QbUt}n4>5{J+OT6Cx_UuAY1~0fx!cb^I?tpdBXx>EzV5ilBrouq zp&QK5!N0bb{qAwplEa5grLt$QtxH_#Gwe@^C8Mxpbd7tN0NHW@&cMc4eSpjK#(zfZ z2N2vsO`6p}Y8m{!7fb^?gF~6&feUNjah8(w73iUz#*!+}t6jYS!q?ilK)z=LzjADF z@OjF8GU4Z z(3_L{Py{>&V|OmJob~6}xc5ch=sfC`jLo)9)>A2Q2^DuI6S}6Bq0Pf;ZxeCZybCEW z69cOw$4Q*L`Q4PK`7Z?>y#ol2=hgd3YvB{;7*(`aSw|+9>y_T*HHzB0D7UX$;QBf$ zOWJ81ZO{{`RXZTT&IQAEfCpC`|8Z+@Ssd9J-5rw`P)3_IhvwAIu?etqba$sU#{@(O zZ1`~ns|h)=C4B-fuQW7;s!k^{^7`J$|4k%uYcEEgSv^y6l!gj*?~Bf$Z|XARqCxkU z{ftJ=|LzVQApV82p6d)N)S(l!Rp-K>#Xy`cu+bg~my+G{tC>A(`sC&`kc1V5u!7$^ zI^T4R194&N{PLF-E$SZNai=n;-3*9a{vUcjj`werKr{2xW-~c2O2ZZ$Cu4R{K8KNr z%;Xol6jfjwsq6o?Pkr|vEISvgK7Xlfn!Hm=8D^J-u-JYV?1U>=35A!68Ch|-zQ>3p zHUc?okX%Eco!cS#O?Ew%S{xMx;@V{BB)T5%{^E>Qb>1$BpU0Fa$aPS0Ef?jQI_5!3 zdQ~CXZQ4tPIsWT4(Mc5JWd48JMO3;I=GocZabp7Dehu5#$s>440ZMLQYDm!VfZ=@j zDkH0Z^sO2;t2su5%NZ2hHH)7|kk1LfzHL8^5BIE_(P$K&*3jm%fz`ZZDthBG(w%$f!)15tu1%P9Q&C zZSp|o)Nf3S+x^Edfesn6{rJBPevN}8@c)OAU%%Yb%h znaC07>Aw9)wl>VMs6`f5ym^VEzk?+IEAZp$iv6JgxlhwvYF&A~Hp-YQpvd74lk6#P zGEVD8_a)+~v*%F9=LS|lAd`4U$ekE+zhJTh>Lgezep%;KHFeQXOyNYuyQ0=or%K3R z9g}S<$|i*trB~dirEj@9x@G7Vq_2F`82FCV^P?5sZeIfN0-$wLFANqTg*yZ$%PDmh zElP2QKT|(av&=x8!>4zBZ;4e zXX8t|^69#63=%c>AFm5$aBgl-P&>^yh$pb9MOS0HhPTqFkNfx8SL##gMLg>EP6I6C zN-#eA6mW%$HqFlYd4P&-&yPFd3*mBIimml;^ zjf#=WIOKj!;`U`Qx16~yCLWo3M~uUyxRd)cedKsNUk^Dm%hf=KoP9=2p1Imka3$CC zjpR{-^t&Q*(F%Ovr^kg9J62pEYDkWSRgSF{b>~)R($Rabh(BR%hIP?vdB2SibsG(@ zNQm-c(9Z~eb09(%B9s7{E~DO!4M$#s6*LP5GfwrF{dV`sdA6kaV(zezV$aPQR#t}M zSMDfM*wo!3kH?nlPW(lH9ANyH{@n!=zJhFLHAZRD0zLM^4ybK^DT*ij4qVIn`svVN z!Kgm1^+?tW|5TO&msT!t8rp1@TtLRBaWviL{Dd0I%`Xz97#`}_uzHlw6*hcLe)vd% zUHNZqb+?9x<~~&>p7RYjE?I`TVyH*K=(Aj)8oK$BC8TvfhAA>srst;%bH&|X$;4q( z+iHg8?hW6NgoAlxz%E>Qb~XCjQ2c0naQ04F%Q27|_R(2(YFYM#J`FL;Y3vo=1}1p* zY3K>B0`U!(+}=wqee+e|LK9w_A1>90PzIXnCvd0M=_x2C+**L;kA1%H2nJDkxn-4n zLqzzrLqq+G;4zYf=%X~KiTW^!yus``A1OtNMnU3F3n@XP z$agWb^2({V@1NUs-JG?u&aVS|d6sB(dmFvrNL=HUoAG$YC|OttPZ3`*GOx1YGrDv= zLFsdKJ;3+N6;61R3n)y$eSD*fKHacCd!Y`|T)%p#_~|OZOLa97m+rc0fBY%y*{1ou zoJvmI^lP7)7}V=#c>!>^8R*RxbyUtJ$?VG7brL5AtB5Rev{AjNXVjWeQFrhHj;2sI zWZEN#R>5{iBy@?#-o%}ixGjG&MEWNxFmGUx7PPb5A>#`Q6x)MPR}FM-7RL;|&$7Ed z^g&C$QbcSR?oo$Y+xCM{JS~L_d3*6c5c>^H-CJF({D;%4nrk^S7>WOOjvam5>ezmD zL}Nf=*(fHYZ2#GPe}jgE03)?k+H}nFc_m|%5PfI&JUT^=*riP3)&6reB)?8hTxxkR zC6qD=X@b8d`}OQK-4zgM_~qWT`SzPcZll?Z876prShaYZ#@RQ_@xOU)&YAKhKq~W4 zk<+7Gg0}&w4EJ+;vlWCzl<(Hfj*KpS2s}KwX6h^qJ+I7F17xsT2vL~FryL30aR^EBQ-=b~QE@OOYgTGeI%Z!{O z?rHgL!6;5IqTRy9|eo> zmL2yGiJjhhK4Y`hOiv;#y60)zwv7>U3wK=SG&*ljyVlW}-30FiL*xb;x8{6|D)HgJ z_tpq{SXs`LnMDU}>9Ft<@k4ydd9qzHBCz+2_LH|R(Lt65hJ6+FnECnS#og_QmV9uJ zMo5dmOo%^7VUM)u=2sRx=XMgBeZ2ul#spT+t~wPxi85&;;2V&&^8S@Lbv~xw=C@;9 zi;VSUrdG`LB}3y%eLX5XiVY9u3U=~$q16Ja`DtwKj_p9qC3dPb7rq>9HRpD!vV0s2 zLAn8f%p&^cb8^Y^)X*hjw>5;&v{$m?u;AM?U(sr#s91A*nEIZ~fgG&IlHAB_$-HY6 z^|sb-uZvZRzUsh}1z`sbLz~rN1AzRN#*X4k`@=m>#*>nBPa2v=KE_9%&3A(WB6ob$ z9CK~z#)24kzH?lQY`SEK9&#`&E(;P?K?|xFj4@WqP&%{(T4LCfv8v-pOR3DHVP20%$`{h z`6m2gncne*C!L2?sQfzFUV8`OnM@ZI6|ym%+xBhK--M^QG}fnx=~22S(+E zjb8NUWQHfT%hU-ux&>c!P~t(dl}!0r>C_Y%gnNrG4=yYWAhsX5nJpK}H(PCg)!QC3 zyA)NNmDBhDMca&igA7s>*tq)K`MPf4`$gU28JZ#QOxm?Wpu62kb?3bU%a-m%eA{}R zoYvMx12>8B2>4DGy(g5F(*N41a;C#E@zC;?dzZdVI)Y};KiVMD)9SZKFABgsNc zL^kE&Nkvl6H#)8T8_sGYf5eP47!Aa;Bz1Mnf;vR2Y5pD=!9tt+*->_6{1^O>{N3$S zu1G(sOUXV9gFY_zR%x*5rF{B@}7#*`1PUa+CHuFfku71bRw<~stui|%Rf}9gtT|{)6nd8I13*<8y;#Rhw2}7b#%KM z1Ob^2qmSRqS#L;2h3XYFsik+TfR)%%Zw1ejg_eEi@Us>uEP42FYG%WqE~>d@OqtzK zg-o*044YRTb)&;j?u^0w4gax$u#@x7q+CosLc8lwVll}azWUNg-=kO|iZGj(5JR)k z*AEJE77n`y0x8or!J5myp)7CPUy(yygScjXuu&{JNL)l@lqby-6_T=JmbBMx5V&JK z`v`Wihn7o&SOQlyPxncFSXm6Xi(7d^Q&BEtwa5&n$PBCm` z>X=W}a(upQcE5Y1ekRnO2-k3Ta=jzQmU;#8Qp-EPWw9wtfRjym$t<0p;!5fO2^DYf zBpVJeru=VsVrfGaFo`hS;tZpmuN&)I{D*S#UZ}>=G0BZbgisd5YIdzVg5Pxh)93oH z3V)=lZs7Xia6_SGKe7eHTP1U}y+0&t6qn)W`!(%X)%U{qx}d~@=76{JwM!z?z33LW z;nvX^-7P(ty>7nWZ%Y$s%v+f`6ra^Lq?@aC9*rbz@rl+IpJ&N7VV8w1tYfc)((lI*JH=p zRabPQvm#@NvDe*wrNlwbJTA@(_l&GM2a2I;;JxmyU(`T~d*z7_ZF(`-UTxP%zgr~! zI+4ZP;jj&rGzkK|mKssLOgj*&E1qcGtqD6 zcPvYwjiQco!g}NjIFeQdSO*Rj@^sg7mT7CnTD5_gOqZkb_>axhm;LodHJoK*n+aX@ z*UfZ-_k_j7)l-EHg+2io5qBPL@AaDBj6fQf(ZpH5AI-SI5*#OTs^1H_B$I~U{#P$q z|9kMY^5~1$ePbBEdzDJ}yqrMK#u zjH--|8=U(_&vvfHX}6)?oWl&lePopB@-t_6OKlNlW{4LVMkNP1gq+8LO_r zTlIOjrD1ZAjWJ#Q)%vxM>9I@+8|l?dMbZ=KorG5n*O9hS1U_lIJ_^=pgt9~R(!(#ksn6S=ZF;hW+lmSCd%hJRPd5i*!OWH!&YNMtwV&; zxv##_l|T0P!2d%1&3HJqVc`F&BWMWAtdvfE?=jcp?Y-4eq1#!V>+xWJZ$ zX3#D@{O2}mNmr;z)VZILWC8h~e@(lBF8XD8Fz$(PA)l7~v{c$H`Ca4JjHC=L@YhIL zTNN+bof;0rT34da1r>Iof9j>ew2guE@J%TOTJgef@wloL(X)Ikd{O5v{ z0zf?+1?3s?9ZBq)2$yt3FRVN9>C$j1FS7YHzRG4_8-~GoRq@1+y18r+8MX63E)#&< zsaPX2CG4zu44?v2qv`6!Ec<|zrV;c?Owu>HU8_uEiJfyBP|mEy0u!hu6SDwsdROK6 z1r6wNts4u)LH;m#ojc2TD($sGJIy{l&Kd+H37GD)JMwQ$c>Z*91^vk;0yJ>8Gtz(2 z7qS}o2#-DZr%OQ&K^kLUQ;s-4hj{gs-wM#uw|Th5GqoLZm*8%aWY^%wN~Cq!&1@^5 zW*t*LeMoN^W z4a@UoMt?Z%M5OYg5WuKFc8@9XiOcbr@A4BaW^P?>!ZZLhDgBh^A3)IzD*vm{8ze0fR||`Vawv zD=;2F#|#6hgu1~Os@PDvPHLDQZlV;J zUVPep5;&W&4>BR-$K)9^qkV8+JU{;(tLMN-x?%84C)BAI8FF0QAZDjM)}XXr4#?&kJ)(|v6z8{DK4Hc7?#x4Bq1eR+h%^r|q8-R=&;WqQt~`Pm z=lrzsxf&uWD}w>cl%7W6mMFC`x=~qHfRro$%J8QA&qUo=!-?erXw9!HsGWkvo!G>@ z#p|>uC&J;X;u_9Dw|kSaZv*#}O*>-MFCjK#Gb~0Iagc%NOwF$xqgJhkTod-uH#owzJ_K!YD;Mi4IBwHox7Ud-O`d1bg`NJNA0pp$qEyJbG5<*K?YBE=Po!Gs7k;mgi&Qwcujo=NUk_#fh%#n zdoSrS*H&Xv-mY62y0X|F?wC;gX%z*S17oeN$Zh`PUjd?)c8lax70$*y z*^@0PEop5aRyV#YEd6oaESalevbC0H8po>hz}EcRVqKwP0j$b3pB{D?3k#J~SDH49 zYy742cEev_aZzWUR6sU^aVrHAi|$p%GUEUxFB{O%HjQhy>r@4zt{t)St=01z z;@~i7O91{jG~p;z8Czboz@Fv$UN!}R^*ryfuOQ`3I(bovvzu@C<6p2wpf4hDFMXLo)s_S8 zx-Mz-Ut$1~c{?#S{z;AtLzDNd6Y1A9iEzX1H?_pYGq~wQsXO6M!?I94)#CbGvYIL6 z8I&j}hiE%yOP4PPH(W{zMBFm#yGc3#FH5&2ah5T^IM3xn6Er@$@ zqjtAlAgUz85FP#b|BwQm%*(DwYfnc)yAH5@kBm0whDsx}t4IiEMu zzG?9(fS84*-BIPmB#$Gi*MTN{`Vfu_<)z?OAAK8uTw@FS0XFwsk~26n&S@WbgowQh zcMD9K`gtcdzOY`QYf32z6@wU;R0jx3)X^fby}{TiCRK|w&-2alxcTk1#;_U3FWa;y zkn~pFNdvWLp_VwO7De8oN0o)BLFa0ATEAq*+@3SeTjoQJr+Z3RxQyt-Qrlh>LC8Q~ zkwe>ab)#fLhdEzB3M5-C00{2_ZG(>5=Ytn~x4yJ8R!X$^plkq(_;`LzJ3Zh2j+ogD zI3=I4MRC$I51Qvhki>(5(xtpRTWL%qRDI%$FoE#Vf0waMpH0&Y?>U2eg@Iz($V%;O zsr*j!v;8DKK$BO$=5bp(LAfE~d7h(TQdatU`uT%uX4;hZr=znLYKK-4e&$Ws!b}O` z68Px+^8)p+|5Cv}+q5q&I2c{lgJ{|brU8RiuD!(>Z`4M=nFgXYuC<0rw&ab07~R{H ztKQKrbVzt=phcZUX>?@^)F-V{k&;nLX+}U^gAt82&};3zA(nlH6wA(g5pwUf&pjD) zvHak=vRA$e053Qso1Jxu4TnKFbsl7oAyKV|N2AxlNuVn^s#?<@;}&8NSmDlJljW;y zr?|2FiDH&N=0N?aAIDyMHstib*0Iwcz3D#iQnv3f)<(yn?{!pP|5mY9f=ZM{mq4;g z<8Ovht3|Sy{l<{g6=E5N9Wk`&iSe>}E@9n};*7UYo8#7b8;f_#@i z=KgwIR-2A4Gq}x&*}~vO+u|Zj&3RBXq zhR%`e0BgcTTs~Au{C?Mt?oGizeR^_zFN*yjM+zWIMS^`smDIR?r z1H=i6cOHO#8*^OZ^r+L&hZ+(nRH3S-;(bqAq)Z zw-v@eW}caDCF})G_L31XBM6FDbqG&s zrqy@wpJ%f(90d-~0_3VvX1}x9<4D5O&!*S9ph;~PS>-VzK#^BvqL9BcjF}>FXrm3- z0g}e!pv|8SHwvolRi9&7D%z)=o3@XHa2S@4X`D(J4h>1C&sJPB0_PqCfPcrnSjJZ= zeI6AadQD4Trw{I3S1Sh|GSd#)(xj&_o$uU?Fwzm>bD22~N~gHj?=vyo^l5^U+k5dl z&$l*`piYQrA5#8C{vwbjPIJxMQ!9#|Do*k?lFOs6en_s3VRO8?6Ohj<)r}K|0sfM_ zqo2u<$_29rA_(xo{%yZT>hw_;0LR@k5B96oYXHn#Q)R3=*x;q=h$qai=C9xr;}F3c3eG}dlumH zcc%~S=)$e-b`&Rj)i4_i$wTA#TNNe*OrTy#ZYvza#hmfWYU@-gc6v~w~;(09Mb5w+*@9J9f zXq{wh6vZX3-k{?eQQ7Q3*Wrkvd&&niz(739n~=^7-#O1aRW?29_&64WJML6IJw40w zghhlM{6+X-_w{8|1Y!AlepcJMruHckzCkeIjyFsd5tk0_F_?~vw(x;AOds9{Huv39 zUqtTz1rD+`A1*c*Tni8d%{=6^zH`$?d{kc&|a(9e~+y{=* z#9^j{>?dc&H|tt!mcSz`E}j$$Yh`~1Z2wLWeXS9huOag)s&0pSO_{;=^u{`W|M- z_WJCM3f(D{M_hpuK;vWL72qt5g zrNiLmFd}w3$q`-a;SZ6S?aZ@KounZSItXAnKeQ7eElY;U%%bF~UU&r@i5c!OI(&nX z>@#7p1Tx!bkOVIZTt^bsQfd^2s*yV%`J9JsCp1#+kFLjeY(4!D@b9x;=@I*vd~3XE ze+ylG=vftbn1NUUntW*-p}JMW#O0#jgl#&>w?;>qkGAk7uNBF3u_`6i#xTVjUMYGo zfnn!x$|)af&83qn5$Fc9Cyf(j^Sc`b;^&jYAti^sGdo51yF?&~jakwd=6b)Sk!Cw6 z<*t%$%5Bc3RL<#+{OG0Vz2H9KLE7=tF2vGEf!kuzIIT8*lW`B|hGxSTFfR4<;iSNX ze^WsPkC7e6TbpusBg>;HV`T9lWp_QnW*s3g%zh04sKml+(4Z&J+wkxVoS*q&_D&H< z&xWXS3jQP#9+*c+y`SS;o>3@}p%GMwnHktX!c&=NvN8j|vQEYZeXI1%=L#^01a{;n z*y9V?%ll;Yxhu2fv9FsCi{}VGshe*zcz$+`idwX@7Q~cv_}o2cjt+3YKqb;QevET` zF9k`#OQZK9qkPzv-?@O^@Vy=9ab+vR4Grv~=I|DV1Tlkf?63jq2{iN3%M^BIe72*m z@+y3NmGYdvks&qWdLSy*v59y0F@dcy@gqYuto(uyPIbJ7ti zDk1TEA#1VmUBjb;hE8oJtV6K{_v3_#(gT$J`O;j0ySC;Vy=*UqdE zFLPQ0>qaUG<8P!(A1ws#fl-N|abR2CEe(XXT%v4;|HZp+qDv}d$mi0~%ICARcs$MF zs;k%yT$G;CONV5{h`dQkX_OTCZKPIcB^>cWXn=U!DS&RI$`w#Dm_W4cK z1q{p>=1WRCO#d=i5KikdXgL@hVya@qx40#iQmKr*LbxD$E*nn^RtgIprE08Agb;i8 zX)d5o)8HNWJsUG?q?JYZ=di*BRnJ@j zr!d^1Lto_o$J2Mmv%S9WpPu$qhf$Q8acb8*s?-XtQKMS3_9(FlrKMIlt=c8Wu38OR z)QFi_p+yC;iy%g=(nRb8iSc{u=llBo_2j?2?&tm7`?|0D4gVbb^_%)mlm}o@*_~#k zzs&ddjPg=AB9hflO4<)H5-+2rA?e&ijx zY8LWfplvg<0jrqJI<|$ApY%NB{O8>jf(3dA*Hqa&BRjeP+36T82|w3l6qr$1v8o+| zhvg6h!}eO{!UxV$e_@%O`@8y$b{6?&!5_xA+}{hy+GZC7QnF*4#U!VJXz@L*mlUL; z42(6r+R={A(=@awerYxd>VVW7M~}X=H+iJ}f~fwN#phV4ntdudejzNG5c`+vBl;kR z+2^VKnon*%XGSDQ=#>1wivcLgL~R&)PH(qeSAiVsHtZ_lD;fE5O#@k#pip1BPA17B z=E*pv3>5YXVqGKsuIe%G>+l>-L)kly+Cy*qLu`8z*_?_*p`C zUCe^NHov6ZCEuR5k5337irH2@rjNV0TP4dH_>pt(oDo$ ztv%`ql4B(<;h*EQJWT~PS+nGdt!mV>satk3Q3l}1p@0{u?Avr}nb^Q>I`_l*Pf$x& z$&QHDy`&PKSFD_X{FCzQmiEB;)b9tTx=BnCZ#D$2$|8fBN~KBU zyi_4zr9{ekF#rCzxazSPSgNFF|E}ZdM(Rs^3&Cy^nj?RtyTYSY97<8?qw<|(zlaQY zvqBt9vmWZp0wKAte#ja$d@JadqbVgIlyr5yy%8me)#OyS;+jkh1%L9$jTPk;@L^)LefMobq zEn8l(wGB!jk9w46NQlKH6iM%>CuTDglkZObqQCf!qTg_D-#IHDTs1L?PZ&1gjo8~l z8N316vsil0XH2r^nrq1GV$>e5StRqfm8IcHH?5s0kKO%0o>$TyqWlF+kB)}Gcj`F+ z=TH(iEj2JBK&TCGuJXe?-?-WOy$vmWBo>v$0Zx4WIll@|m$oF-Mi4A;4$t$A0;9(} z??99#R9J*`JaTmpErr}FWB4^B#%|O+q0kqQCWgpnRKLj1bi2vY29zN)cAz!j05&xaOWxM%-~Hv zEFS!6kouGwAY+P=S~Weio5)yy1`IGGwVN=P3ah}mM8z;>aAjJOJ_mp)h?a6stRCWKz%&T=sbt63BbR_W6dfkBIyRc zlK4zQ|L7#x^rk3hhxIi4UGdhY&13V)l+OJjcDAOIQ}n){Q7xZ!#O7*B_LGLY)#vs$ zK!!s}>H5M+-8oDG2VFPXQp0a19nA~#_qwdA_3Yg<6~=1kYk`s)}3c+-6pFP6OV6ST3j@aXt6ybO9vyKFC(?bct5HgBxfLX3Bharhvq$HRM)qU z8}!Lls!udHc+Okq+T4BMD>NnQfaE>+w>kB4Lp~y@+to<8^f<=Kchyyxzv^3n;y0%m zMWS4tW^X(j{8gDP}7H%oAq`=Km#bZ+7y1v z8waTs-0wX;wmRV@QW_hmszHYd8KLfH$keU0lE^1#HUa(L1HC6!WuM{iCQxSKPc3a$ z-mIKZChu~mUA{Yx;nQ-g!G?CbWc`QuHuICcC+vqWvARJ3lvR8Bx0|in=+&mkYtV-U zTlE^5HDRAucgkpRwt&yGoe{x{H`y;_HB|Jzp752MxN$i;l zfW4z#@JIAmb8Md*FC2Y6$`z#7;?TZ)a}gkL1BKoe>=<;wm6zM0hJ#SB zvFE%El%+MhY%XO7*i$qm?>4_eXGhSPUaS8_%Q|ZtJPYHyyYg&?gK3?hSr4n=>Q5S( zb2=2}mtSJv(i&fC2$imz#WPXToE!l_P8z|Y(iRtyOc67Fy|{xh1x3itc_S{wTpSf6 zyi^+4sfUJeYg~q)cW>X$%p_&qlwhHD>XKMEdG1-J7RKP^{f$Y|O&=(qy$cY>HXg@Z ziB!V}_0@q9pz_sF$r9Q@$#(QK_&&n6f>HuHbi93Jl>ok8f0})rknauk`Ow z`b75+A5%!e@-L;Un6B4Gcuf^1DS8Xrn2-WvbkeQcZ*{l5h4C)^Gp0-7;*pwH5IRaTv;WWMR2cD)8#1LR;|@-{&LAQLvbELvILG)#K#Evf5RXf1hVtO-13_$32FBO=}eDk>yoo5mM z#sXbEn#QO##eQQdLeSrYWFv4n!C`+{*W2<>p+YsK(a3-+NU;WqWUHk z!E|N?URr#=w6Ps?;Lk)ycUrkt%HEIwj z&prIT)*)1I*&yn`$^I0g6!`v5(8`&jnIX2frfQFe8)y`9IpZ`&X=TKYNjd|#s`NoQ zR?#fPPVxJbDPI5$Zf(_66Tsu96FDmIh6hKuDHje_dHTJH~^7J9x+1Q4_h}&^w`zaJfu!pbneGPz7>5G?A{e%Vewhf z#sAi_e+<et6csZv2>>cr7V^B2+OiovwCsN2!i>i{}$e^WfiItah@g<5k;P6z{lt zbCeF%{}P7`Vf2|AMtsWMrq!ZvX)~)f@@dWnWL8W8M8l@chB;5dtv&W;1k)}69C+Gq z?9CqPxy<(2SOy5PUC*MjUENMsgcQdQR_rzd|<_eE4Ozj0@$tQd^~@11me;R$tv2UiHs8kV_A-lcfB)p(~rU z^Fy|xN>_XQiGX`kUS_1Alg4$}n;F5>Kgn{Bl+85tvn&LPQ0|3`2a_8_*Qv*rD?Ts9 zZ@7P)!My9s+by%R$|a}kRjc};=iJpMq1*!Bi}&^ISip;AgFrl~4GTe$*;%nZvfq7K zvFOurmuR*d#~-J&OWzHBifi`ONsle12Ti1H2Tg?*@TbJb-MoEyq4$c>Qb@jc$orFxXDXD45N0l2d+d*Jf z;3T=-`N9{~uTIRRO!%@EjoigHR`Qa>f^Y0W)(M6A_?hVdp30o17+#M!b4jXi<6 z>Ew5AwCM^-cGS}U=~>nm6>0T#73QjSz=us0iAb2wlfF$i$?T&`vBXv7 z`rS~0`VT`3MDlHZ_4;{XdOvUr{~D#hFlP_KHw_{!LgG>4Cqlv|2(-Q|BW=`teOt6k z_8sE7(2yM4Y$l~4RLU=IN*$t?S-bwQ8-dTb{;tw&Mi^enN{aoc7SXwwVJb6^as>+- zU~l8J`ZHs952#mE^RujnjBj`JS-*Bpd1w3!9@4iW2jJ$@IJ7X}jb3+CJCsYbo3Tr7 zK}LWZLR&|evD=tUknNIzl(sgQotd@f^jGM5QRu_a;MBqbU7BG+>&yG`S8Q#ya3d3- z$HIz&R?-@$6+cV(4h z|K0>fDALP2O-eUn=Vpxh&%gm%4i55`c=#d$Z18K_7KkBe|9tPTa3st|9AJ96*snpx zy0p~$JTv2ZYGaT{|If4R?AFKyoPmY7KH@^On`!z^e;%|c%-u|8@KXS4{B1(7yXvxZ zGMBqbsY4ov1c{da!s-q5TAlcvC_w|HEXpLiPH|CfhRDxY98ZCyFa#vbIIAr)6y z^8Su7WAB^h0jmNr@lcnX7P;sFDMZ7vm2~icaF$Zs4H4 zw*f6!;;L(tA%esX6dXAV?6(ibO+heOH+w#!Poko#AjHs6iX@RmkxPHkSmppkJJ}Um zw58iqL81OAhxag)YG`W5l8@Qo(4N&NJ=67|97TeYAy>UMOHeNcmT$fV^}&dN+z?aO zbMy?X)<%qAd2XJQCn0tjl=hD&Yhof7YR6h`IbVztyST2aEzDvQP$&~NsfomQX~__D z@4#IN)s<8=o*yH915ev~ibs6syF1KK2eQkL=hYix3_p?$Q+`VonBV-Xo|H zl?eu10P}49`Vc*ZPOQWGLTv=D# znk5JWZR?7Y49N-Ixj@ z+W7;(HIhfKeHy!GVM&@Io5BVlvBfSY8dC?QDsfdjdYc@;E(59f)5lQS&WK`pH7mwS{ZJv#WfJ?ek}53g zw7*s7xm^pkkJ@X1axQJ_2z}?Kses2yRBFkt6W;yQwCVgrXkH%9D0}tESX;fx<}`9! zB^(CzBi;5Leq5H#DQg>!PJcL1Z|r|&vlD(92N8-ii2CxP=0Ddje>7mZZ!)OfQ5e6jk{?mu&uUhDW5rrl<_WZ`Hgx^ zsqXEY1lwAKD0hVo-kYu``j!lBY4-E8)U?ydt(gcc5H#V0t~!6(QMs}5Zmd+&Zfw_5TF~)5|K-0hRs@0VWr|%gDl>ez zRt)6DRwzSno(9nwodiPaz3HI$ItwGIY}}nHa6Jo;92Am>+IaS^RVr&UUBCT&WPI3} z+(+X7mqU*HSQEU%woZwPcCoEotwnqC>Y!}FLioeli-*$T))c$D^>jI}Fc5O&Ddk!n z_TG3i5?4F%q~6t0>E@8@LUcr_A9tW~npCAdv`Iz_Yi!%s-1iot(M;`RfqeSbxtSh7 zNtTXuA!k`gESi|4q)!q!_@(yR;&bIp-1XKKw+G{CbC*R#WCrhUclg+D1}5s+bv=-lN^&X-048(N!!5#V`w*F|fe!aVS-ZCKYG+xT`3KR_ms}$IZ?<0)hwca9;;)J0$3tYP+Ns z4pqgCvR`iwoX}!viRBhDG7O#+;j67m?`V`kHqeEkHGZ-gYCX5vE^EE+z~6Ezoa`r2 zRY%>O8R=6sYTPDp*2}RWVW?YzBOi7yFA#3siPDs-C}*uxaJJV#J*FkYHu|dpS--gJ zp1%ISz~JqL)eqr}cfED$(dWi;h^e^5p8GHsCMy2isdu2H{N-WVKYfVjo}FuWt@Fe> z?i*LQNe>|f*ofr->T|m+GADjoeurmg@@^SSb>vgQQK3B8_&sHTET=lBBum6hKkC?HuR`_2*2dh@nbzdO6?THP0tY}GzOnl zO;{$@Y#eh>%U3nvU0KSo6z_!0@1Fu%Ly?A-$gJ6gq*{X7+u}|t%`l!(fbi9zp|)R>50?rGH+5T3ms&nYN!yldB$2pDasQ{{?2|;dgq{FUH^)RKsQ#6(xoLTC=*LH zw9pn5V!vUd0V=`=w*A`joyvR}sQW?)kp5qzytdyRO?3A{qa>UY~%Mlo#DycjFk>f9kh&W%=Dd0Almv_o)c>7My zgq<6e#C9Em*^I2f0U4Y_Ft}~c#z})m>|IR0>Y2t%`%V%o^y}Qn%33;p`ew4xI6=G#)I zd`h*I=oMc^4hbyz!Bi%KOw}s;3j6j1URYb@O=rX!F9dAat;BDA4TO;$>d{JHkstHE ztc6dx9do6zS-a(k33<&DNa}SxkffUs*g~);dL_?P#!)(_{4VgPS}mW;^&Zz7zeYG@ z8^D)*a&rAydlN~4B9is?qPKS55iQg8uYyN@fYAaecEeH(OegLEH!q$vB(X8KRTA5v zvyt4C;4Aa<5-AncE$=V?RlfQ*LC<3HuVtYRZmtugfQL3Nwqr|n+$sfm4_CKcG;@tc z+_haW=#avW%vJbnVhUkzW&528hzdVqeX6r5cjg?`wPt=FO7`~mp~~4^K$j$V*{uIdoHYlk z4OO12WAA=ijx`T(UW?T+dLX`TaJxdXt{Lmh>*x;Uu3H+bC6_C<%)msML)q?=)T~qV zFQ2}xb4X*)PWK?)z>!}Tse}5Gl|dS5LXd2@U!Sg;>z|AMgN2Q#$Am0roth^A0C8j_ z*^jVCs`dRH5Zr{x|4s>6lTy9v&7(FFg*&)-9zjV&b=(#-W{bMbbww3xwLi?5Xfsp` z&BAg+iWewSl)x6|CU|@T--yPqv2AR%dOwk9D~*ZNngZSzcSvp;zWBcy83uxad%;_> zzcqKtv$zX7YIB|tsIK?-rTm1U&pll__2VuvWck6*R{2^-OZD`30_7L+wjE!IC#hZn zZ}5MFYYX!+!&F(wmirCoDJv1Jle+W?NQgZN;-(`k?By&-sw*YbQ&2N(9L?6&#Medn z_~PAPtj7M2^V;pg(#_Q7%G7DSX>1ce>1FWHGW0i-`2Q;R_e+~)_e0eZymppIcHg&S zS2nguu9kD?GcwRW3ix3{zi$Ix6yfpD(LXE#e-HHpL0cJ{%I5aJKij>-&xwHGzaC`P z4^t_v(El`W#b19ias>XNQpEJQJVGL~TixB>WT>2#Y=J!9t$k2lj-i6_(w%UHu7Hpa zPt?<#r!$vcU?(O>Hg-`m@@^KTZ?|;SLly-Er)dF^7tFzh(*5&KZYtjv%Zwl{J2i> zXoflxvgpitoMN=iRr2mujpZmJCiQws>F{=~AEZ%?+~oky{*6uGqC#R?y^@e;fN|oLtKym8%jX=X&d3!$B`Ub*2%XCQZS`eeG+*g zW;#YGTcq8pdjVk6oDcKgE0cxN^ymv zOg0)2!g`LFctz^I5>Z!{E_G!b=o|;Q>GW5{J*TL5DOZ+UA$bXN75enX`(rYs^-~D& z6vFgarE?yqzR+VtW;)| zc>p5Z8?RFj1wgxzwy5t*0VS<&E9bq>dNb;(G|~U5ye{2QRN}hU&Qne=Ts18G8QnZC zBaoNrjrUVKxcD>_onJ8tEeSvog4ct1%wWlfh}!IEID5qlz$NqK8VI<^Yww|TE8sD1n9#feQDov4{689{+x zW2qcDkp9Bq+IC}Gcw|E0;U)2M8a0IRMoHk3s^pkR0rvvVV&ApJndt{QPBHQ@h)K1x zH;$r`2TC-DlUcDnx*Fe>(#G!FKToPapNov?nh3gb3 z6TkdW`z62m*Dp8o;kFWxh#*)z#5h>x?e`o&pk^H7hi z7Zvl@r}tkhD^;g*90m&xR4b{P`C!yE=0ln)qevQ zmt%g6wn~6_eK)LrE6-}axmtzKk7tmrD}WH?p+b-=*5?4fb(*W`+?hq;&^ z2t`S6&3h>X;=UhaLr9^sVvnP{X#cc1z6MLX76IZfiAfN>5kr}7BlGHCX7R&sW2aa@ z!)tsTC#1Vi+&rNzzd8dHkB5nX)L-0<<|BS_03{(&Uu;y>Z=gd zua8nLzY==@P9{PGJ4h-KNhnyA|QE)=Jy0+@Ppc^#%T`9qRwv!mqkHGMo z1x62^!4ATyd(i8^*~oFkeUwwFk*U7`_ZXGBRKV&~{wYeQKYUHLPklO{XJkUJp|1iz zyhU-L|NP_7*b>+r;$$N5SH@;tT(M5Rqdf1O3l8wgSEq`l$hhZSO}>Tae(+srE0dvE zHN1yRC=VmM687f>*<@v+3gUQ{P!0kcc~8vY)y=TS%H@U8s0N__ zh?jIf?wZZyldDw_17w z>D?0I7_-&p770{WBSM%a80f!NxoIC1jjRkQ{>G?0np3%VWIar}!AHaVGu#?T)3t$K z0B9l;{;E$~XRy?mTNY?l40LSePl6OO&+iz$h0gj}{|t@3csTBWAE2Up$lw=FA^wnK zePU3A+4Yc$(7B1&8tA3XEMjK_nXBM$Vjv*3@^SVO!t*?K^M}%6138y>r(jEDVCdTdU-TQ>2JKRlN zth6Mhck(zYXA7Ce@ULDX;W*qDWv)n^(5$jHkNO@U`llD$7m`A2)zVw6sa3-W$1Pz} zQ)@b1^2L!S8Tm0g# z)?YM~92bWb_1seHv-bF5hoIzNh^y5BqlcEa)cZ*`n{^!1Qdcv0q|sYnBbYSZtvgBQ z1+EUBbIP#JazM+V=nKd7r0i(g5-g!OTJS_deMmVy|G%D-WD|P+u>di`P&HCm@5NA| zta_RbjsUI4KSytoV@5j!#>S|d_=zdb34Ac4d4UtFe!{y)Kzo3`AUiP_NF*x82e9l$$^1E zI*;r;o`D|43~A5yWtQ@O+w4b5F@JAn3i#XA7Lc+~dm0_Vw4j?S?d2Tu5vBbG~O zmM-Nzv!^;ryajJii^zYurghbJ-gj$QapP{H50YT(^9dIqhp`{T*}7V$pJn}LUp({o z7iZRGLV$$yKP-1WhQFR3pSo^f-nE1Xux}N&tz*1ya7SBE@ZvW8k4VOPTV>Bbz@%^c zX0!X{WH~b}_`eCux}q|-LlDDl%8ilWn;*WeN|El>TQ;O^TH$Q`&JWZ~t`wz*7TErY zpf>GmY`h{8bJ&=1!d(N1Vx2sw69Tq7&7tCuTL+4KiS|JO69c5N_UTxgeR4%1zyY60 zzM!za>aS-$Ht|lGwN5JFqRs06y;}Ob$ydtAOKnhP5@$%IbU-9<1wZOa{EC6|OXY_e zb0(kFry*fdW{>!~0)&}<1~M&U|82r6yxYXdec3#}5wukUI={uUwn@-tyB7%MjoPY< z7_;W&1#|W?pl@4vjNk+s;>Y{b^qP7LAWCf(YEKA1Br51UH64_d+ukum8~ zE1!0mDM3lKrLr4=S%h0Vv~~G{2&;`pk*0&6_I-Zic4ONRXN4bhN6nhQR?Bum`cy;vt2vXj4}k{dnSh z<6oPdAG!N2w>wXsra)0I_roLg3A!C0D5T4*@Z1C!ow?Zj#+p%5$WgFx`u=@b?Xj8- zthPLE>LzA$j&*hEAOSJwZr;@&|L#63C9|{#S`VKWvoDT5P5XJ7GDFozkZs2v(^WEn zdXqE1r#T)|(Hmbu50H+f&!R^nfc9L*zALvx3~jQic6L*TURH{4l@ti>aJKwi=zI#M zah`ElR1B_484hJG{hWILkFlxX9RG+xM%Cj z!V zC9Ep3SO@G*4P+#_x44nfjSlUW5y>DzovLd~%MzJv*Cvw+s)0SSSmRljO4zQo9bNP& zXv#<_UAufm)@Xbj8d;y2=aKEhm6b(O*FR7P7!6msqk_&6hXuQ}zioRt07d;o*iJBB zif&9tAiD|jwr_+u8pWw9=-kB7e^t+V7Ge* zUz$%2x(i7YqL20^LtCECf^x#V*Vu$+_s=^p4daCQLN!rCR6;^RsVmcNjz~D z_O8qZ^LLc;Xg~bb*t|fP0!~PdePW*-su1Lve`LITJh0_Guo8-yo7?bDvKN**@;44T z-d?Lv%1@Ob^HFk(PUfx*WGWq0ZdX^z-vmY`wIcb)fdZk`Sq<2=x=fKmGICa zyY#z#D78}ZnI;3#>*#OkZ_Z5_vtLm^sCxB0!vtQeEucNL(l%R-*%Uy0eIdI$i7(t- zmFJe)X_VGCMSD|J8j-IK6|d!;|6X@)4X|AO)?PmjXg_K^?nPeT7uk4ZWVdD$L#l+~ zBK8Aopo6F$tOn(nj;cEjgf#%mC^R;yGm8~a_eanir8a(oGZ4DxmkxhCoUInv78j2u z2JLq*YeN&Ok6)B1v}j@}F4~puY|e(p{iz&*Q~TekO+!`_9wgl*_XRMz`f)?gP;10V zTSfMDiP#mxr}d^O*q$YuweC9*OfyP7E0#K?c)p#%nmYMN1K`mJ37OsK>6|>nk6OKI zL!2daXw5;RS9x11}wNg;A*6|X4jSr zaDFQQMqIH01h-R3r{36uUQ_9upo?QrstW)4h9YgQXNVk-(~6z~);egOjuVCj&VA&{dV)4?@_@TU z=Lx5AoET;EOwCP{?=kPKOrfT#mRxe3#eALkaYMn}2AVFf7j52>%r$D-1tTqY>>LbG zuBFwctXCCWO5M|V&))e$TRr9MV~6ey{0`Se_VA}E<{pt#n@%`x^`{^xSgxjmaKk<^ z^Fwt{DC3y>vRoLOb5ODcGdY4$#8}WLBhRd;Q+drtj#)D-`+P6=-T3=Uik$WhH7^r` z^5z66l589in5BlY4TSmw+g3fh-uN2uhNYdOC^!ao44PC73TUu4140$A5cN7i=f_O% zZ<=iWd;D(Tg9i@mxgam?bJN|{qg^RE&s^@I;TWx#i|UC>aIgdRM94jqa9Q`3VrPTc z$z(pynVA!WI=^@;fE#nXoQSH+MeS1GTHBIc=2qp*?@ak^dUidEzj9g; zyBwuKEE5%Njqr?}(=~+fsr|&7zg>N7Er6FsS1ufz+t(h8?uI=p2}jOI&!eW(sK4V+ z7>)C6FuX!WKwvD5k(>H4&@Mmy@3>IrCTghPJ~@28xm_XD6KA020?xutT>#B}`bx7w zo~O29Du;A6T}>g12NhqJywA@zNb7D;v|4`Y@){#?H63@8ZcAiW#I;G@_P+*O$Fq@f z&BsHX`y;hg^ZS+fkI=deyv=?ul!K61J8R!h@X0wjq%;Hbf*LKf%+l&+&C8c<<3gdT zBULXg>n{L{?_)wmMKWxS{8h6W6`_8#-|!@_J@Wr@&rf7| z>e6HWJ&U*J_vHQs$tHoa!n$fv_!bf8OQ>ixR*{uQE%_Wx?*ZecU(fKpc4XqRHscW< z8g9?RFYE9HgRXPsbG|mkkeX#u_WY5|7*=cw=mqvG?uZyouf4B$yKAdV^=_1U$ zGQ63kxj!BHvAV6RB1Ua9o_5=2R1i|LPPc%}HYB3G+Qr;gz=*x$;o=Yg+ju6&H$jajf9sZU|-Esl1c5wqHNPl=BKHKTY7?f2E(fRDlhX_3sCwU>mnDEX;f zl-Teizl+y?NS&=Z8FshMO@80Vr3pPYF*Y#Fy#!|N6S&+^>MdaOEO^x?gjJ%;uROwq zu^=nb?TUzat@)mIw8o;Rp1C-;e~@B^JU!2(iSSEg1G3g;%W^Dl>}fx;X-Ef$XgYRN z=8%Y7a#lC3bUwB>x#c3X+eDRbJJia#5qR+?JC6mpZ>;E zgkqU67o@3__i&_gbwT`9d$Y_4CJBr$-nCrqsJV8tfiFwineOChdjrc$Y~w?a5<~eM zF; zLJ;;qVcPwZ^>tjcflhy^alLkQ>U9Hy`p`F-&x3%U{+oAHMM$j2t(?-zDNrJWyxQoy z9ywtv^@~=1@MWDDX1^d4xxc6JzAsUUzSR-NhEUEuwBa65X0Fn5Du1T$`0%R!e_q|ob0 zy-Fg3Y@(6Z$9A!&ZYzX_Gk}T}euq~LIIAU?I&`NG#qVVCZDdU$vRD?QPT15W2lx_~zSAjS*n*OZBfN zcHS48wDuwE1FWXi*;;~!uK{Hu6$U7(-<(L40`!nV@31J7x#~o?!SaC!gW8NKeiZK{`M8u zIM@i{mqd!NGZA&$QO+>9b|Nu^$r=uoo^InrA@{q9D$&k9L#PvLodU3rJ|e<)$ZPSV zL!v>VdflQ`)sZXV8&18h!@$S@z?)X!YejC=!wZ89z(w6->*Z)mZ*24Z zPE0Uc7Y=c(Ju`UKv`Ab+G0f$-M={D?~C_!HXpUBYdsY@s=Xbh@bWwmF0KcpUPf!WWlcJXvo3 z8n}e2^y;`N4xrzV{7D-?Vm=m;B+@FvYBi4!xu$NyKoHXp10SqVI%V3?9llAiV$w&u z$*yq329RI1m4Sd=u<8sfvk%)#SR>ji?JcimA=D?@l3{%wWQt7yVf#7P=dUbwM#i1Q zoSnwpEIe68eQO-JjW5&d<#NFJjDGmeXT)*a`;Qr*+fr12|Hv$*J5*GM_QjtOn}Z^mLxcxF__nY16Rgn ztm3rfgg)r5Yi$=pZsp#qqen)M-^M4P?25$BId9Fg|G|?)ea;xwZ{v{rQidUuq5#%} zo0+CA5)C#(fYwIC6lY@C-y!_ecBRzgHK6e2&6Cxjj>K~=(ZGv5M;iP??pAhIV0Wv2 zq>!vM9df!G@t{_da;e~nlmD;FR|(Y88*lO1?2uZ`-m6CD;_)U$B9g7=1!Ps1qfQiT z{`{NN;1h_kqtl9V*Qt}>QB1;$N8%8WbG#@AqDi4|wNHqcz7>zFH8UDWR2$_Xop}MD zb`ydbJ$VE&Hc|DY$p2oi-59;jD|vP!s)hvjbzU#PYnwWmat9iz^FgZTNU^~e(%a)~ zqL#Vm0Mj9DfhHffbA5VZ%eWlG^I_;d{ivK~XzI}<0>sL4Z&;pshcTTHoM1kaL+Mcq zlz#ukLG*X{&G2QLsKZdHbWmP8z(`T~p(~p0j(TDj3pf5&c0I885p3>Y){e@zia&SI zR>kzewzR#bwJu4f)u>3#Z||n&@ss)V(ye_nagz~2HjWeV(x|FO_|mSfY#mX_+v&wz zMCBh<5w0`Z{Moac6|3$}{5{3@P~+9M#_X)kvaBkVY^r4SLvR^+s*)$@+Hq;EI!fPh z5Z2mSHV^5a_DkjGA=y+9PVY=@4+Q*gI}Q46Tjg)1v0&~fk6YH7i1i?4_9l1$RHdtb zhrziTE8)c6`<_RHSr?? zAI;sZCl$mOX=EOshxQNb9D1YqWC>%ih z;-Q{1XRgyKtF7UGwLPWDwhG-+2j_poIpsP9FK!{x8p_U@4;X(2@%%IRD!d@6I-dJ7 zl=Is^bsa)@XoEWY4V6#H7{;30<%>dN+_d)&oeV_p(M1V1PFDIN+^%+5#r|Qt?$WD3 z52lWN?_QD@A`oOSsJ*C3mVh{dFM5Sf1>IOpG!|G)d7?{l)K;V2a(l82`H)@_2LK3N zzDeB&5TgWI+n#ebn{&4-+8&-Ki4^+<%1mE@TH`fmU$$cX z+d{hXr{?8Gt?+Y3V26Xk6kMSs%~VkZ_RYi~&ge4R01;TxFo5ntbG-z0gfd z+OY|ok2M|@WWO;NGEUMtfc0VJ^3-4XE#!1>>c-gnLe18;ttKprpk|~)y7H;dVr~fB z)?U(wci>>SR$ALbW4>Wiqa^9Zg3j38?`K#Rf~&21wd-$}Fw%ae1^?RKWC(;AqQ>Qk zR+Sy7fv@wfdstx|n9r`O>b-IS1L-=b;}Amr4cEQotyeHfuysoORT0VbTw~irJ)3&$ zRnH0~hIg2rrTyJEDqq&4`XwlVm{<_s3#G^31kf(W(9QbltMR&WI%TBzhsJE8gCj^S zSOQj62Rxlg0ntp{@0l;TkEZF#)d|u#d*g99C%11IDEq;Ro(npUOb;L*)@`sZIy@xL zRv56CfM^aBjkb!T1H}p9O}->miNYT5-ETH{XIbcGD8|Gl*!D(Qx(*| z*&YcBgs~_GewYk+4COZQfeU1)V*RWSJ3Y>lDPPv(hrj_?1QyeR!!JmdO9VLI8gK=Q z!9J%e0XZrDd>7*};EVq?%&@UdT#KUB*fYzZ@4JyLJ5TT(Eq4bPC;;t6DLkStbg;^U z49ek>@nxuB$Q$8Qc)^C$O$C!iYezIL+~_hi-o)4l-2!m*E-?@SRBXnjlK zLf#@ZJ$hOH-ElHu*Q$2u=f`CX%2#_`$a4g!4Px(G=O6{-q+0JUp7PF4Io!hG9rJ{{hdSIEuzn=<$rea-RgPQH9jUa7EqG?W#U!4nLB z<&+V66E#87kbJTq_x0)c^DjylV<0P34BnnDIprk2;7@{B#PyYIGBR%|9b>X>N#=l>s1-x=1__I&NV zc*P1AkSaw1=|w;g1cEf_0*dsa^p1ekkf0*HM5KvGM?oo}Cep9806{_z5IRO6^b!Ju zkoUyj|9QW7c>I#H&&-}ZduFXQ#@1!q`WKI!vOJeM+^oBTevQi9RWI8aod(yuT~dEos$ixJ>8}ptc<* z)-IV9LrDoN@mF?l)GEHpMQxdL_pt4U^uV8(u4l)^k-eXzo9vtMoAx5LTV$&ve~RU9 z84;oTzmzhQx=*74T0Ut}bF^R}bMGYoAaQJLx-gu$ zhURSY;Uqc~fKuuL>Lyf3@MHn1)k4otK=k*2+!^X{9J)uJj{2pYW10$R4OF0{*Endn zV4@1h+KzrZFeX~s>xCL{&Rzd*R-~c#`s`66Fx>fVGf6E?O2AlaYy|FhWIS75E-tCn z`QiNV3Ny*n1;p%m_I?v+d>WgKakBa-0Lj72Wa8Vp{k%K&4<{(o6?Bs66&zV|o+vl^ zc&~M=StPyp{wXAGD4@RKSCT&Li2M37XnDIb%U?szwnQG$^=`KbTWi;#`yp2WfmHR9 z@JP9Gi3a(Yu|Kh(9hcSLxFrTT|4mgfd3;MFs+H-Ze=6N?nR6AgX-tyd(el@PD3iPF zyA8lyer5l#)vr`X9Dl-b0NdA3xlwM`!T+8u^+Q}4>@62FdyN6l9jawe^^|dXe8Mfl zgZ3&t>>@0t2~fg1i8%1$B*Uvvki-wojmD59TfO(8d@;dTRpK&OsihfUh!Ow6S%6yu zJ5MU6SdUkQVb&yPZ6ixv<$TWdQfDM3{H0$;N%c-Pt2LsRlYMi}Eoskw{bbC+E`Rgs zw$ot8u2+3{I-C9@_hz=5)}<4t!ljS~>X{TM(YowL7-l8tX(okt{MxK#eohK(Glg1U z%k5BSe4y_02l4?s`BQv(X2&%$elt{vaS1+_5jXSz{{Dh$z=Ca!tsAxOaTGB;U-K#m z)l`962)GJjG-Y9T`n!13OZaj2N^*MyW~dfYgYcV3E$G$J*8W>_^W*cy&fc?7{%a~Q znGti%`fPeDES6;bX!p^T+hY74ret62Qsk^(>=rhU0xu;k! z?UE-otVH`B3P1;9)wl0b7Ek|BJ?UJl@qAO#iV5=7?!J-m&wr&ibwFEsdI=J406rvO zMrrLWXPEKw8DX^FYizmVrQ|NSs8-0m$7HW#df8rUY8x_BdQ8dMeKS63J}DWG(K7lL z0?AqL*?dTx4CWhz`Gu++E7GDw_(3u^ZByi42#_D*?W6n27N>snN%UP*tE%klA^JB? zufAgtz`<3-i<)R?V!Vr0hbDrasN=?i5O#;RU`m6Cf3HdSspy#&gD!~iUdqr*)V*ja zEg5hQ;=%pGT(y|71QtaQldsN`UP|F)kguJGG8S!zMLKU#h0|90e~^wUHimfpfqV7A zqvSI3K*C|(0I`E{=P!c3(qJ%mwb zTp+x5X?3|CqC_7r?_LG*9COkd;ZNa1e z?Q~sh%L9^SQjHno5*^0L{Y4~)37@No`vW^VJZQAzM0pUg1HyUi@qWWVT{8}gXWMg* zv^^F;q%|x&uqW*9GrtuQ`zzGOWkA89PF&Vw_@r`uI4IjXqGG}*NUQIn@>gN;yBWn3 za)6%grb);iKVyN{H`3TT!C(gMMN%Yt7p|KE#G-@d&n3}St#bgjms~Y}V-_4eSTUdb zJ=VBsk{PsjOtHJ5IDLggE!IXZowSEVHRzcYQQ>R;P$S3CEn-%X`f(Ds6x3g0CNd1K5 z!ScDOno?!c>2TaQ3=gFLBZC(71d9E`wK{R@_Z|Fc=j>hQm${8gKn>M=*=6pR5^Ab~ zu3mApm1Vr7Rn?1wPOglpqKcwmii- zOL!#iS_g!2FIXtOy)YCj_)1u)!g#+#dmElLF+t`{Eo$0`a<$YN(RtoH9)PT8IcRk$cW%fmBW5y%Cx&ACNWoLA@H4hDB4zc~Pcl1q7b z)dAk)R^s~pXKQ;b@>p@YDrTO3d>LvOysdyQ4ltiXh(nN7f6~Z&;~i;Qr)pueK`k$X zK8w`9TyB&*en*fI$b9IwxFpmj)E$!h7@VpoF5RUEuRZy^u{WDzFC4_8R7I_d0+E8< zZ7Nleu!yj6H`}pZ=U0sSd=(B2#yarHHSZr7Psk|xduw7%2Oy8u`);G$kNdMUA-1gv zJK}c1J&bAM%P9EoFNeeAsj9~L&ZNvw)dH(-XDcfogNdmo;UStE%Jy(!otF&Mh?lmT zEKww;;nFz=9&>ElXf;GunEGo*Rr3rRp}p)Vm%H|{m*L|1_CG?#G+q~wu$cT|InGEDw-JC%-{ zAfsORR$EYP%$|i)vT&Hh>2P(cv!~(4@^WDj!ON@Hk`I55Y)QBY6hls`XQt(EIMzbD zl45ncy5xVOd$LF`D$3`>jGe-4Qbz683+JZ(-FB`v@+$h087ws}-(1W%O*+#mql$To zhOPPE&%Fbf2M}T?>B5`vY2vOf)=7HLPf-T;znZD>7ye5spTJ#B)V4LyA9MG)pHd_R zLm_$%(C7pcwD5i(;-?SclJ!^eJCeVjMWmGi3g$?I4t?)FFyf&teSGS-Y1r23=3d9~ zdS1NBI9q8FeSDVYHTU3)~GfsJl6OO z;F}omsr`n}EW3h(E<|l+>HWoH0jbL;MxcTTc_#5~hXJA|iZJd2E=-MeH?+JAJn5f;pGjj%oiqv1AXV{#;U(I;7~wg)R7l^C zh;grW)kj~2_tg(Mp22=a5zvCs+F%JYN!5CIO6sl7uvWe)X`(6qLufBRVriaJ5RyK% zlREmk$#Wj|_LY7E4BasB zBfv&YNK)lce(jl>_wc&ES`p^HtAq|!PA`=tDgdIpEw=RWDV*`YZ!!nqlBgAQM8k{tom#Zw zPb#8>-61_`S8*;yMYqL0t*|+(sOSb<`pe$+-qoD6UFO;>n#mTd9C*>FH4n924zga2${9zI zrv+RsTijHi$NWhH?m_-&(fTHzg_dFa<(iS`-JJqkd(dHtHbV>Qzi^&nd9Ey9IdMX* zK8~ON-gO5ixl4CPA4t#n0(#YL%mR5gcf$wkhnxzlJP)SWe0riY@;J&+@o`pHfRV4D zRV2h zQ*iA|Xz860?(-^-TFZM@2K@8N#7-|R$=|j6s})-iH8@G-P=x%B!o_kq!BA16c(5SU zv9%{u1-@<@HXF9-G<$V?^bv)jk5Lor^em=S&R}^r2 z12q?IEmP~iEt1+}cITf2`2q8FO3i;i3d&^4Tg1I$_ z_Zv4~X6G%w#S)UGWtw&hi@17fop^fvq_6xC_#g=3lKd$0xJo^Q#{d>HG7x8I4K$-% zEt6m|3Fo_wV6h3DKyg)H@UNagH;10p?x3buTu>QfOW&v!nO9YuY}pmnzM+l}DSfj1 z%>P2w_S-$&)Iw6bb|^)kqA79c{y>YlvY~Tf53d#=cYbLKiFzi%URxu;NvI*2eU-UO z?e^QT{f0u$Zye2G;L#?Eo~D{BYH)c>R)MR3)kg4!AfYW0ISyrXQGVn1gx%J@lphX! ztopuQ@{ORM-zGC*6?rQ(YXi}K^pF2n?(Ujka$6rOpcn<1UPx$f+pfZ*Yo(E(@}kfp ze#a-lY@UffY<+TW1!Zb8^otJ{{EE&vwk!+fHWLzY6w)?+Jb(k+9=9o_sjrmH-nHUH zb9OpmavEHFhwVLiS5nPavr(vQ$#(^~q~y8+n54r`R;icb+S+^rYpbBY8?Wna zvMoE1VRGWvL4l6CCf9EZjoG6!t9wr}s{V5do(aZ0>;#gR^uC1ed~JQO8z;kCbtx7w zr6=3!8GZDy=`X~(V3;Mim3I;Nzhb`o@bQ4VTvNdb9jeRkx&11GxFb~xoFt@Gm~zmA6j#|1g>E>N!oRyG0xG{H&=61L?1S)*p%w?ZV0u)?l%C+W8u-gouJT-8`%xufk z{#(3^L5e-ag<6prTd=6d?>qWuedVrDuLLEZO#E2cHKpyPd?C5m~N3@h+R;6JR4iF8EFNN+A-#ih6Uw$S8E~xgbjpg4in(J&N}f0 z|FJ%9sFr5}mQUyh5S4VRi6#LZZswK)u4cAVpI39Qkaf+y(<>CGSIi|2vL^)70~kxU z((2BD@quaA6Cz{~6Wv05Hv*o311k%^kpP@6Lc1lg2 zBV{rEoLXA`h9`fQ^l;nBkeEc%? zT5JuZ$N8hMAfYL*EDo})*jXbRwz#rYn9Uke3fu$N#sd^umr;LG0A)xTtrC#O6|ORt zyGh1J?_2cGZUSUls0lqr^XdjcdRHJg;gbtMcmS#y>I>Yq3`&7FFRU3DDY#E`s~nOY z3$v`;rZizuTmlG~;Df8`u)R~wGCHVwXTV5zgVR-_3)p5WH8%OJc4n-umZhre(=LU! zTuj+2SyYfeXT!AocbF_rOm_1TuYzl{;+sX)V+c%#w zgjGC^>f-v9{KNa&mTSP0p+6gwUScJ3y_IeEBJZ`ki3Azle7!_Sj4;oa07YNNJM(S& zd}xGrz0QVDbKXo`h>liAQJzLb1TOMm$Hgu-8e3k-Mb=SsTf`O)SwwUX0rE<+*bc-e ztiWrg_#|6)Vq;S+u`yHs@u!bZfl=tCjt&QTfWpckWxr2LTjg?pmgKZR;fCD!1Bh)( zmGoD8U>Mo*#^uU;jeRe?e6K1!#klOQSIJC3l(wRw1}fg|hP4ChV#QJrJ3%F&V~Fey z&&Yn4h+vVi%bY!UZCB-5`)5HnkVrBhvzg#?y{%_D2rX+}TLfTvIOX*KIY0@0 zLGiogfDY%rp^2r4$71{yuf(osQ0E8jcd)(w>ZtKMb4&AAk|4_S<8L{{?EN!(rL z=Vg@_lB{33bBQc{Uiw+&=ijYc8rj-!^S%d&!31Xo zQ-+P50Oge0q2+=Y9Stkh3)|qA)+WUYWu%#Vdl{yA->4!z=n&#Z)UPD9Gkw!E)?i)= zR9p6W(%iM~P`lKZL)#@9>p`E&Fm6^_sxZF3#&CEA1UZ{k_cIou_P=E3pc+oI{(qxh z_f*9&-t!_DZ+oeg(VWA7NT%6eLKkb=Lv8xvPjt)n>wFBXy9N>stygo|5K*Cpe44)= zd}oYd49eF|#aCrEQ^9*9e4UBiAg2e`ZC25&v#ko zM-MK++Yx&Mq$f7)eU}-1*0KP~=hzPB$Mk9RbdKh(6>BgC{Jscu_*Dui2>1ls?qI@2 zzG@6^(*0JaIReuYY+?h%yp`ISF~r?w=&%tN{Aqq}hWyK)`drTZx6-a;dk=|*k36?U zjN&u^cBLu~JSD(T7sx<^Kim%39Ob};9GHHY4x#M%JQg|!gVIVm7RsM~7>daVgR z?60(zYQSFK$8GZaKPT?j*%??L2^3Y#(x=D=%pCRlYu&gAU#t_7h)`l-{Z?)pgMcp* zcLkN0tNz;N-f@VTUcV2YfV||`#)Y=nf_SE%N>AtA7WO<~_p{-q!J>PSC#=ApmfRcv^MCuDa`1l9Ck#HL1Vw)0agc1@gAPA<0g}~;4BC>O zuS%_xbbO`4%Y&y|g4T2Yi+vx>2wg9)(-yjA77oB9fT;-B6;Olip7#Tx+jkc#d;i+i zR;^`a6Z4!JgU)dT)`08X_V~*rt56t)Po=_QOQ7S{*)GU_`v!8hXQw1ed$6F_S$kq- z`y24sV$aWFY{LaGOstImDjlJ(*rt2Y_6*VbPv?S8P`F5`Xs4Cp$g6 zZ=|`pzK@7`m|fW-T6J5pXIYo$FN?_;D#&wTy;{^y{Em%|);-AoQjv>zInY{VQY)bSI-k~ntYbi~8XX0_(v zpe`^oaSBpp#={1e%rAP9RLXgLA0kC;<*t)u=J;q;RHB~4<49~#+sq4dx5AF6vH3J^ zW#P&|yv4UQU71LRq%Ft&;KmPgwKVEGaF~&sXp4?$+hFj^-0wu95BrynQW-D8BIBz{ zqJ_mHzI01XS5~RdgYG~bU#L*u%)41i5Gs9eI8^Pp3%5KrOjbSBYy&f+qGh2PL6fy-qt5LolB?`gfeFdXX~ zEvaLtS1b~k4|?(}K`UBkY@Fri-p*V-6kHyC-%Jx-W7TVv=N!x@-ry3Kb;5nn2uP|L zJq{hi7?K{uN9ihR?RBhA#2P*u5J+RI`5ECFJrP+uRI}eUs{}N4p*)Vq0ZhWgI#H&xaV$&4c~{{)_Ph7Al60h*Lf?Y-zZdNyT2_CSq9-p^+! z|H$|b?5IwMSLI(Ts6~A!`w)$(EsIaE#*(E@c29sZ7`FL|GU3YHoiWxRr?1_xUt^L_ zZCWXH=c8kR^3hlJ#1-$@@0s6Y3|GqzylPbWMNy&MZv++EIZw++H#VH7`1f_d4t*nGV1DE-VgoAFNm56fX^d zv-|d){Yn5+cUt0$b@*)CBP8mkNE)XZk6U!Ca27Of;3;9etm_hAd0F9x8)g1iJ zLXJz|Y4uUFL~wYBcBG)$n1Ewux7mr)hk!9_AVhbua%oRs*I4|0>}E0RrN0_$2ig}L zCQ$Ec{NArL-ttWCq+mtkYeZ3NRX#``p9F3ZfN`@1Ki!9u>$vIH1^i91FuG&=hh4AQ zqNgP)raKYijR6I7t2ZbUH$stASz*_!$($%)~$48w|DEy0KN4-OKzeYt!vM1cDuJbpT2Vl^T z{RJJDKiXRPDzja}b$xioEylSydiy$VMzs%;z5()}P zZf)mi5N}l&*}*t?TU}T)N{iujDPs`ctj%2>;{l^N+MRk~&CwzGk6$)+Mm^?je|*T; zX2$@tuaW-2XrRKYua|hHTNdYYRf>FbFW?~DEH)8RVtIp6#=!blu+!}2UCrM$S$dal zixKuJ^47B;T`>+4)+xb|D zb>i>V#Py^tU}{DRn~%TR@AVauTIVAbiSk8D1yrmHGV&*1EUhY{lDy$XQ&8DCE>+*6 zbYlC@iv7~X6Mc@$exZ?+R1-;l|H2>{sfhaC^XelXT~^D3k~8Z$aCKF(_})+>jZl7m z`d%-91z6-*v2r$rl%St#4W5RceJ`m|t8MW8El}uqXV#$nphV-^I0|1QiL-&|8cy!^ zYz8jap~I?nAD;?T^NBIW8d|$22Up-lr+bj)_^F*c$*(iEAznsWfxtGoU() z1Bk1edq=Sj(iVIWWICle@54?u8z2%Ofm$xSTfi+asZ^xO!0cuh)r%g|tq&gTJ-j<1 zAiA(9cRxL@Y_TulW6KUSi8!6l@zs88G;|I+2wG^rlWT>Pt}p}YVT$fa5r^*l}(7-Y|8>`iKNU8qPy}R_OR4d=B)D1V5t9EJgtc1hY>#aQZ0jG$1>gV@t->~dH zWUwLtkLiHs10Nc1xsCOsm|L(~m!jQC8p*+sFba0NGr%f`#3>8)VqoldrHcK*!l*QC zc*)YtHoE+sTDHO0Vk@O~Vm_tD&CB>105MuPZy>ZIRp)_9)bNJC7Wi)WYF%ubqt}bZ zi8@uBN+!W!$i^tLVS8owuRX&@Wn%${&nv`xK$2vkutAX(x>?oq>K%8WI4^s$5dM%a zl#ifEPL|=8i`nf|G*Mg6k#;MCL(lu=ui0&7`ZQJqv_L9n#h{Ua3ej66Sr31FJKynO z0w8a#^0z(_kVzxCK<8Vks4q96JpPVwEGP+ExjumBogjABMEiwBSSqM6)6@-&WymKq z?!@WK;aA&u9eBDyzQ=BIZEg%o^ID-`%!PT#j(c9anWjKLD^?)YtoNn zjt?+My)7d*F__9c`QXVHGxp{+8!xu4Qu#XXL<$A;tUN3(yl8tckunw zz{5-bl;!&FakoIB?15E}+st+bPuCgN_!IWaXJ}=1x?*~iq$SaMV>5P%(2r;gHyLDr zr~ScsK0&uh(ehF?NJ=aUPZ%blml@m4fiPn8rL!3{Ss|$X_RP~>I(}jToCvV{nKrqK zZF%WO>#730^GDAiF4Qi69`hgk;8D2GkSZr-J<>6l-Ir+9-ov5I2XLy0l2z+AW%>Ck z8z>Y3SAUiS*$?+ahjXNC8=a)eaO7m&s%v_BIyV8{1Q5MpREk{Lr7I9u^oQG02aVs7 z&JT+E8!-VCu%;jZK%}aoZJsY8tQ})wBWhuRm>*~KSyaUx7tV50XtcL;#(d<fY1Z|sYkH>V3zIMyALOksHrx*6HZs5)E_{!obD zbG04eJM$3SeW|u`_Zw8?r7@w&`@O{IB&d8{rxgXwm#=fQtSWr_KuBmQAgVNL<;lGe4&jHo!at}#PeOM;vToJ<6dx(L+33ql;zT_Z|Gys%G1o6haP~;Bf&~?f$u29<5nner`k&BKTdMIKY`aRC4*X zlEnn;`3CE*m2EDI(^2gXI<&e@sWH|!S(P!~?Jd#O2 zAWNw!#NCv77!jz3sc(I7ks*5lijjfNp^lDauyqw*f@YRpe5U12-6wF#%{~=Yp;^s}KbY`J<7ejzhX+32G>-PmqxVhQn`!8<) z)2sEG(NSFH9o^J7uYyo+iK?JvOU#97RYCJD?Z=Kju!uec?={xKDOLbo{GRPhQ3PVIZ#ISz1ED@x zF_Gj?cu1Z4a9pZaQeS*T*ON@8M8{7?{y{-5c9a5d2EU9t3bMZrH7|_`?O1xMEI{+t z1Af}*o^wf34$?rTEan!womsb5C@g*uDst^1>RD*ah1yE*zBksSzg|RJDoN!H@!l|_ zZzL*;P@>zixUQ=OZKWy?oO8?pVX#;x3vUlW(mh$x5hjLnk<4VTKi%ezg`Uv2s(SA&dAu5PlOaQ9fT z=KQQd*cqG0<@Xadtt&U`MAJjdN!Hpr(1nRrLjh5az zvukWW1}q$g#n3>mDnC#2|3sZ{%gc|e=0uyzfzPmv#(O8AG`p9x@1C#xYlC}cD{4x{ z5;OtPieM793{3ffdWO8vv0fZ~`pLQ~YH@lJruvCA-PmB1=T{Mu{p!0bK)$GJx`PB7 zT1ip6rcxaU59wq?ayZyGFfQ+;reX{AG_fWp_36qDG0)p*8I?Yh?WnPiYdPH~Gr>nH zt$8G*6t*|S;#X3FLR}Hm_kG{xVbQ(t{phJ>iOc!&&x4HhSDB18fnhM7pX{E~<037$ zc-yVo>W??~?=mh}B}U(db@RTffwhRN zUXlF0ogmK6265kM49-Wn-R*d4TviRW8(0a<)*%3tkgjiX;s?;Q(}DL@0?e%01srZq zEPoBen;*W7ULp``xvO|5UqdZ}QAnVw+Ki9>$(PBFY`2F7lWg#fn-1x9Yf<5}w#>r* z>$kKk&x<)o@@BPbsJp5H)~OAL@7 zb}F2%k(@3dTf$ee$63vj`Fss891)u0CC6p?S(r^RF5;UzGT@u*`#a9j7d9G$nCw= z7D`)!{)Tw;0rlvJ9<5yU#lCnh*tn~Uk+rS8Q7{JKVgaJn5XDHyNHgf##(YM5z@cA1 zJJLaNB`4%1KW&A9@&C8NueO;$;Ymdq0#|7Ux6Vwp@zITOQGDre4Fg);-v7?<<6Mh( zIG3LxYlOy&B{k6~UHi~hUqxj^f4Cu#EnC^LU%H~a`a4C^$BW%*L6yM7^%f>eAX5qf za^T$uYCYejF6?B$02s*f?q>f%C&7QqbcSx+Q78(a`qFzAf}bstoQ5Yf@~x6&dzjxIv0mfzu1rO4T8X~e*2F9os658RI8)#h)2$6wm+3R9X96MSrrDB8d3F!!*VX~nGJ8|{$4m>OZ~=>!{EkA zRjC}ks2-UQn~QXF4czqYxO2xf54qOWo#vEwW?5K|El!z+zd-iCcka4H?S_FGY!+)b z-+FlYKli!^@t!Xd7WM2X6yl0_Ft@x~sD3OVaB#6~Qs^+zr`4B!168w(TSEnk-FLY0 zRGdty*-;kS_iUGvKFm$&WUtgI-BsT%QYM?()*{?QAdW6S1yUbky#E0jN zQsWc+A9kO~@{;RC`7+!}{W8fowS%Lj!;s2T&oJM8d0q-oKz)_Z^@oS>%6MV$z&vbg z&dl2oe@VCIwJH`@ga9} z&z?$~Q6;$9St(2IhU~4vUiHundt|Smw%{#UV1Q+jUltQ;;JogE29pm{(})yb#%F{* zhNOK2z(o~DO!B_j96`!`Dxu%(@|_|w_07Akvj42E#{8!r?Kb=b#bSt{cnU562|5&gf4$wI?fY>;_jbm9yp9@hR4kM-{<%RcuuK|e z;Uo5=_By7}_{KUcdUlpP@$nKc&&6{Vopk?P9^InPLW_>^<6o~L7~}a56Muw{Ym>1~ zzm=w6fw`5Z&BO%P{pTJ%xv(`U_3`;I%f+w{x{tVV#krX({WR~%Nwzs@Ed(yo|I>$&*JQMcj^0YD5GL2Op zXmsUU`LhD^Uy>5aQG8R$;m8e!!{)lmd$&TU@W;d|)Uh{aPdU^z`M(;^MJnQTBr_mhi^kW|cH`y5AuR{sRuv^NU6sWSbW zj_A{_GPrkSMdColJGt6$mwybFfByWla$7;M0&oYC1<6Yxcm90_36g zyqcT&ktptXAM`6|!i$IxH?{`DT2d~4{ru=1c3rqUD2v#X42J_1+`20j`Nh1{bl97I zSw8yDvlK4LJ$o&{=%6#5@bl?FAF7|!pV&MvLXF+0+8pm~S)g0ja)KFh`G8eD_+Q#` z8iyElX{-acN9+!w0SF$pKX(&6@iG4LwP0+Q_LT;#d(;wFMM{@CUkmox=^b4)uf*5k z^Ao7XO`VjGmH(QNUk8>~lu$w06}?*OM*N1#YOk^Kf{~wMoTD!M5@1^Ne=-X&R{@5D zVDtee>oC1qJ0;2MWVnM=`8hTvS0)WD7D(Y}x+g!q!jexje2$%ra=VWsYGm(V?)Dd}HX7~ieD|VsPji{gqt*3Us0_X~$37u5i)qrNh`&wnaO@m%84*?Z{ z_j-xH{5-3T(#uxqcI{m!pFeedqX7&^L#esEcjP20G94E8@26l3_OvMf1K#HN&JaqV=gacG8S)9$kjApMaROVd1&us?1_@&jDDJmoMz?RERr!}S$m@*d4&{DJMf0FX! zb*LL()`nayypcJ&mSx7lDS2b@=TqLZ0$roT*)tqIx)Yv3ojr_{P-`YP1o(9p=hNQZ zIN{H^yOZ_q5A5Z*&SH7jga|(n2$Pv$H0Molz1EfV=3_i1#LQc+IRGNPALyfFC4$+XU$D%1N9^Tp@NaK89lu6@3Y7goc0+ zDj9!;Of|7rJbTo5k7Cs*hcC|OJ^7Q}g7VH>XnFjC^rH8EwMxhtEr8*H=5&CEm#kIc zFy;BP8G@wMV)5?t3J3Nme2uYh8A8T+>Pw)js>nY>DKer@3Q+2Jfloa;N>g+4{)>8- z9a72y`Cq42TSEsMaZJeu%2sz|tM zH`yj6K8AcuE^V7)3evSv%RnL4VqK=!hmGNx`{inqn61dth_xfNtd-Jvl5@0=`=58# zDU5s$y!*MMORKQh6MGe2Pmc4XuIO>xD@w_a7pk5jMZ&k5a$K2zy=wC@6_{#_uyUEu zhEz9cZ{3i|@CbaKvClDjPmF9(_tYYXH_FVRqtazwmMS`YU+zObivF~2;AC=(iPUw* z9whmFx<-syEY&Q&5(4A8{~$Sypt_6EBFdb&U6;m9Y$U8cIcOFN19Ip?LPIV1v=qNp z>>%k7ei|u>*^X?OQHnqx=95@~cl{6caGpSW`_uD)f+o~tYkn9&M{dJnJ%O=ikW2YX z(xgCd)efkck_cbAgo%w^%R_NlXIpdk7a+p@Ztn|G4Lxd?mh%4zOHm0qTz&!6ee9z8 zEwdm#^lRRb!EZZ1&bW5nKkNS8wGnMSeXY;xsuOi=K5lGVQ_!^Nr(4|7)b%jQASDJf z{3HEGW3nvzfCSyZrQ6~RE^ZXlBY{FQX}-+5a(Kop9^2oI2RNcIXzNVtsUO~v>W1Ig z@toqBZ>R%RFaP=M=pken?GLqEZaF&mMgYvnzSUx#hurffS9{+h>zcWrYq>TAR2-@p z>TmFUB0W}9OYyUEx{JUA)X;mbFSW{8DEa?nU)+GC={g667aX))H=B%@*&16OaEeJp&&Of~3x3gt`H>vG#v)BM;(n`1;9&ZGHw)F;Ff`?i#GYbp`EXNPxEzncr z_k3tdr04Q4K+0)2q8*kmD9zbfAnws{R%c7edjrSxdDZSPt?986!255uGFH)F8%F+8 z_c;XiN>2PgKJtk(ik&$52M%tklkqR5w8tbBLMj$J5MQSi+Yhffss5^2DYO&#%L(fM zA3eKgyFc`$D|!%4At+@n-G4g$lso-9AX=@O);)1j{LCJ?$k&1t2s0=j#tJ%g2OHI zW?QZDl)()^&aNy9_4IOb*29*3tYFf=mpfO#_CwbH7HS;Kg|44ZuLk!bX z8q|`$CTaAGJG*UI!Dvhs2QOVvgk>(|etp4u9A9q3>ic==U8vli;+p#^og3_Mga_a*mmVk_0N^U_4-<$z*fc)7FNy4 zy*a4uCS%_BYPqRQpg{oO^`fahhb^J??`;U%Cwix>{epH|1 zfaAzaaO^x%pxx^ay7;JK&E|h!cle8K=Kfmi-p21{eD+Y3FZ54?BvMr z%E3JyPz9E)#P|^C(pA)-JtwN<3*V}@@4h*$3CC`p&Tyulk8=h_M*!(y-n)1mdzSzq z=DQP&%DT3J2VRO9iC#%@oUAg<8u-Nmt-+p-;E%V(u0!u$kvptW{aYVEz>#Z}+bjST zS!?^5Gwb82pH%C%>SNEa;1hEtalg!;yA)X-X&)L!T zwpo1%laJ(y$l#u|zW}iB+vp6Lz>W^Ch8X}`1t8gQ(=bKXENp3(_cmi}T&t@&Ktk_J zRA_cICp<`u3ZnwXk{$=frKW7BCoY%cr`EjiXTL+xSxD;Vmha@`0Ka|q;1b6FssEP` zBf)=OK6QWD2Jd_98|Jz{8=wF&lMTDm&v_jXaEUrP2GNfP=Dedjbjq<#SB%SMNVV)O zQLn_ofOF@{N`qwD#h}9|em9L(HHT6KNlY56{YgWYl1c^S>gFgsWRCj%;g$A>8Mo(b z{67({UTIjn*>o;(H`Qb~RWZGe?wDd)%g@ZVg8vy1d6K(lfTMzs#c@=f6k9nl z{l=#ImfWpodqBdgB(7D6fJzXjSXkMbFry#v0e&ap0DeNGd5sQd zvt38~f-h`VZ_x6PSD2xf5hjBv@QlR0$4Y8#_K49=StD|j0{xEUMtkTK;=*q69Q`Uv z*GaYh{0~cHK;0~GfTQ@|v#MW8umyb8L^TuqcSpyBvufHcdy_RkRe7%?bb+g7J3ENa-v$bbclok5sYRUHYw-v7!)Z9z048 z`s1F+|E1T@ZZ~)4;Fpeg@_lN=8DnZlp;{vWHyxIVyH9RR^s0mBl{Cp7%|k2~8n&o- z-x`Pm!e;|ziJ?5ju5FfT8$Z)xE>>giPrHGbV_WwZSX@*Fx2M02-&wB}iu{$4adspO zXpfi{hFEqPUTO6P1C(~PfXoEN!(%|8hI(`ZpY?@Wc$%?BeGJ^FHvw3w&-x$x2A{;x z?ECDWkJqYI+t&3G_xJRtGWf>i?FQ>tFI~Jgh<(f%rSL3&b7Woe*7Iol?>wKG|J~IU zk*<{FXJ+9#g#l8?#ai!|tS3L}z7;WLA}Z=Qz@6V@(b>JHNi+3bYIRq3HCvT2(KmCZ ztWsb04W%x*hxCU4)qhe-q@}$?`{Op-GowZaXy^1Qil>{Yv3QyLYn`3zI2w(p$1hjagsD_eOZD zUvruGMyyUHs>aN-(R}7kR9B|s1w8-+gDLAR(H6XOU8l9Z2*luNvyqoUQsvyWJr*!F znUQX{2OKSDZ|OiB-?&C~Tc6vPqkX2(@OQL67{J4oQ{^S>YzBm!_)Zz|Ss4s`TP>_q zVKt%O@@kDvav38JT=mK(IOWz>xhXvLUU_OQX>9v~`=QTyU z*rms5McdcTx><|7e*To_CjzmK@QMsRu?E~crQ0uqjK7CwuQdCVf%LvX`)y$C8gwhaUrNCeTNw>NzO>8PP^RXhUe7uaHTzWYN3tL~>Wl-l*)i_aC#D`kkpROq= z^t&$snB~{QR%EPHu5l?|v!%IXU7oE@@}*D67i>S}=XPfP{OS6hTn;q^_enT&fL(Z|CP#oWo?b`9_T3O39|HT3VeNct0r>m?nXp10v&khTjK0 z#}95rHT4Yaowx4gNMlp=AAWzn|6I}+AEiuXwi}<>ymLaeM!!QQR?w|2eIF*{HUVAb zZW)}igs1l*JhPb$PbZV93)^2qeNXBFLc+(lP|85F?iZ~w`3iI6|Lk0!%bVGpbFV+p z4W15eM)v#eml=-EO#rgRmxf*KwE*VzHB+(df*?1%qFuVv)Wl(1rK?&JQCCW<=oWuU zarmb|J=9*tBY8&hBFdX-yG(J5FEfDnXv((DdJukAqS8#=-21#tEeGUgzqJX{y6oQ>n_~&r&c_; zvTFXSIQq!i@L9CYBU@i0(W}yyJnB(NHhrS`&zU0jQ`PdAA>}AXpyH9hvoa)mLazkX zDkmPK@zffsuh@PoDTn#8<|Ga#5~#%vz@VwzW7brkH4ZLdM*(i9y^selOKm?V)Cs53 zZxj@i{JD(z>$;MKJN652gV@ybG3KA{ChsPH(e@=Zf%g5Gq1h#O_ndc4d{3?a?A~q# zd@Cv2vN~yUD2*#3BCOs(+r4_V^d=TPCs;ghKGq|8*42^L0eNv zwj-N93`QwTj|RwH`BdL7Sef)ZoSk3di_JIBSc?fTfmWn`vkySdQvjSbSLe3#NZdo5 z!WQ0vQ!U9c%*bKp#Fc5dba)U3r4#GMCl|$Z#<-0K%&!ziFzbiw!wb#IH;BWK94p*>ve@hj1im)e?|%){R8e z%zX=IKnWfU4+VTZna<5<7(ZKi`L}M65*GYCF#s{FjSy@6;eHTLR@NfZE?BAXMZEZJ0=*Os^yq_Y?24`HQCA1fcF zCyx6cB9$zxEEk5d%aeYTn>62L7KDRHHNbVJv$G_*;G|+3P>2d^xhW=wr~8LmYpP4& z=ihxDBvfG{a=+b3nTt(L`$yp1(PmMU!X*VeE+lvYXqXkiEtxZYlX3oU!NZ$pv+n_6 zJSE&tH^wYXB!}+19uindN~uRpnKdLH``tKDV&GwEW4EEe06-@VN}pIN0aift2`3NB zaMN9TCdF!x5CUWq;|XibozkIa9>nevx5m^vK85cVbJkVFkT>mvSB)+9d$!B0e~wz~ zJl}SSfk(Rr=64|fw#w8}FUAE)Rj3KV3rizo$M^+y+7Qs zttkKEUfq`bvXkhrtCRa9Zq0@D&$>XQUeZR34RQz-f5@wT$g_*EK3o z81_a+oq)t;8@4rXWZeTs1z@>vAWzB>s4<|)s?F>mrut*#TH5~ZfZ)&esU-9X0l1b5 z!t@gB)7VjO7eK1&?d{gY@v`bgC2ptxReUh6qv|+DCYSNb#&JV;1E*OUt1{cMI=Tei zd53^nmI50I9@0_4Nbk#GeS~V7Ne+A!x_));53+NYqrXr7wr>rzC!rikv>J?BrQHC; z(b$O9-#n(}|GZ}!$3+HL7dw!_O`idLs$a(xh5#3cw&V5kE113O(p31~cnQF1DId6> z3Vsz72L=qzIx?-PUqcm!U}CQEsXi78YQ!+KeF`g&U@IINZ^MA#agcRjb+HkKi^ zwfLY1o5{7@_$-b?v09!u{DmMnNI(gc<}{aUJ$P@cs35H(E!MUToI0amnL(>K3KIi& zVg422kRt+ObN!`>bvyUnd$WR)iX66qu~AOvp9$Ge)KXN z3&;C)U*nb-?}N82V_C0wyFco%8`y^v-HxT=KiqOSta#r!0nP>|i=0w~Z(B?noEvRs zPY|4{Vulq?ZHj>%cyp=>r>ejO!Rb|CZ<)fI)A7R4FT6Q@Q~a!e@xtj{J4E7-a{xKQ ztGjUH=bo8m6N2Is6NY0S?iZ_jR?d8Rf>vmle>yyNPgr!T?xD*uEMAPa!LIbT9Tgeo z33ba?E4(*cDqii4mprAGZI{6AuMZgBto!2)ZJp*3o2+4lUFiAxxk(;LvY3t_sRaR7#Qu6d{ zSb%gvv520E$dBPD9rm~Tj1C4m2C0t{FUISitnX~-T?pvj-ccWstP$8n5FLS~Hh$$0 zb}im4>14C+I65)lgAOxnYy%N_0LnFJ2L$ak=iWWYpCyk?J1b9YZfWr%l7hTzrAW4Q zih)iU#L^F9xD&N?j(ubnfuzOxNkI)1K4c-HpiCsU`e|1sPy0NmtZv>)AJYd`mT_cP zmRWsVxly7oHgwnKHMZJKD!6!KKRHceO|}l^6Laz42u@x5PfytmQ=>%`$f|^8?hJ2e tyw>gqefole3{!YH=81}MIyX{*lBynWD=rUDrepsK-MVv2&E~x){||~k8}k4F literal 0 HcmV?d00001 diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl index d4589908..132696ec 100644 --- a/src/shaders/custom-vert.glsl +++ b/src/shaders/custom-vert.glsl @@ -82,7 +82,7 @@ void main() modelposition.x += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) + modelposition.x , cos(u_Time/150.0))); modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + modelposition.y )); - modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0); + modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0); fs_Pos = modelposition; From 07fd50784037c749edab6af7b025370f66976d62 Mon Sep 17 00:00:00 2001 From: leoteemo <93679707+leoteemo@users.noreply.github.com> Date: Wed, 13 Sep 2023 05:07:17 +0000 Subject: [PATCH 6/6] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=201?= =?UTF-8?q?b2d3fa8ef9c263e5ba7e2b225a1ee8b431e0e5e=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 64 - .nojekyll | 0 README.md | 78 - bundle.js | 2 + bundle.js.map | 1 + dist/index.html => index.html | 0 package-lock.json | 3850 ---------------------------- package.json | 22 - pic0.png | Bin 80597 -> 0 bytes pic1.png | Bin 78127 -> 0 bytes src/.vscode/settings.json | 2 - src/Camera.ts | 41 - src/geometry/Icosphere.ts | 179 -- src/geometry/Square.ts | 47 - src/geometry/cube.ts | 123 - src/globals.ts | 5 - src/main.ts | 141 - src/rendering/gl/Drawable.ts | 67 - src/rendering/gl/OpenGLRenderer.ts | 42 - src/rendering/gl/ShaderProgram.ts | 128 - src/shaders/custom-frag.glsl | 99 - src/shaders/custom-vert.glsl | 93 - src/shaders/lambert-frag.glsl | 45 - src/shaders/lambert-vert.glsl | 55 - tsconfig.json | 11 - webpack.config.js | 37 - 26 files changed, 3 insertions(+), 5129 deletions(-) delete mode 100644 .gitignore create mode 100644 .nojekyll delete mode 100644 README.md create mode 100644 bundle.js create mode 100644 bundle.js.map rename dist/index.html => index.html (100%) delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 pic0.png delete mode 100644 pic1.png delete mode 100644 src/.vscode/settings.json delete mode 100644 src/Camera.ts delete mode 100644 src/geometry/Icosphere.ts delete mode 100644 src/geometry/Square.ts delete mode 100644 src/geometry/cube.ts delete mode 100644 src/globals.ts delete mode 100644 src/main.ts delete mode 100644 src/rendering/gl/Drawable.ts delete mode 100644 src/rendering/gl/OpenGLRenderer.ts delete mode 100644 src/rendering/gl/ShaderProgram.ts delete mode 100644 src/shaders/custom-frag.glsl delete mode 100644 src/shaders/custom-vert.glsl delete mode 100644 src/shaders/lambert-frag.glsl delete mode 100644 src/shaders/lambert-vert.glsl delete mode 100644 tsconfig.json delete mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 30fd2a83..00000000 --- a/.gitignore +++ /dev/null @@ -1,64 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# next.js build output -.next - -dist/bundle.js -dist/bundle.js.map \ No newline at end of file diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/README.md b/README.md deleted file mode 100644 index 39b47b7c..00000000 --- a/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# HW 0: Intro to Javascript and WebGL - -## ReadMe -- I made toggle to change color on the cointrols -- I created a custom vert shader with Perlin noise, and a custom frag shader use trig functions. -![](pic0.png) - -![](pic1.png) -## Objective -- Check that the tools and build configuration we will be using for the class works. -- Start learning Typescript and WebGL2 -- Practice implementing noise - -## Forking the Code -Rather than cloning the homework repository, please __fork__ the code into your own repository using the `Fork` button in the upper-right hand corner of the Github UI. This will enable you to have your own personal repository copy of the code, and let you make a live demo (described later in this document). - -## Running the Code - -1. [Install Node.js](https://nodejs.org/en/download/). Node.js is a JavaScript runtime. It basically allows you to run JavaScript when not in a browser. For our purposes, this is not necessary. The important part is that with it comes `npm`, the Node Package Manager. This allows us to easily declare and install external dependencies such as [dat.GUI](https://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage), and [glMatrix](http://glmatrix.net/). - -2. Using a command terminal, run `npm install` in the root directory of your project. This will download all of those dependencies. - -3. Do either of the following (but we highly recommend the first one for reasons we will explain later). - - a. Run `npm start` and then go to `localhost:5660` in your web browser - - b. Run `npm run build` and then go open `dist/index.html` in your web browser - -## Module Bundling -One of the most important dependencies of our projects is [Webpack](https://webpack.js.org/concepts/). Webpack is a module bundler which allows us to write code in separate files and use `import`s and `export`s to load classes and functions for other files. It also allows us to preprocess code before compiling to a single file. We will be using [Typescript](https://www.typescriptlang.org/docs/home.html) for this course which is Javascript augmented with type annotations. Webpack will convert Typescript files to Javascript files on compilation and in doing so will also check for proper type-safety and usage. Read more about Javascript modules in the resources section below. - -## Developing Your Code -All of the JavaScript code is living inside the `src` directory. The main file that gets executed when you load the page as you may have guessed is `main.ts`. Here, you can make any changes you want, import functions from other files, etc. The reason that we highly suggest you build your project with `npm start` is that doing so will start a process that watches for any changes you make to your code. If it detects anything, it'll automagically rebuild your project and then refresh your browser window for you. Wow. That's cool. If you do it the other way, you'll need to run `npm build` and then refresh your page every time you want to test something. - -We would suggest editing your project with Visual Studio Code https://code.visualstudio.com/. Microsoft develops it and Microsoft also develops Typescript so all of the features work nicely together. Sublime Text and installing the Typescript plugins should probably work as well. - -## Assignment Details -1. Take some time to go through the existing codebase so you can get an understanding of syntax and how the code is architected. Much of the code is designed to mirror the class structures used in CIS 460's OpenGL assignments, so it should hopefully be somewhat familiar. -2. Take a look at the resources linked in the section below. Definitely read about Javascript modules and Typescript. The other links provide documentation for classes used in the code. -3. Add a `Cube` class that inherits from `Drawable` and at the very least implement a constructor and its `create` function. Then, add a `Cube` instance to the scene to be rendered. -4. Read the documentation for dat.GUI below. Update the existing GUI in `main.ts` with a parameter to alter the color passed to `u_Color` in the Lambert shader. -5. Write a custom fragment shader that implements FBM, Worley Noise, or Perlin Noise based on 3D inputs (as opposed to the 2D inputs in the slides). This noise must be used to modify your fragment color. If your custom shader is particularly interesting, you'll earn some bonus points. -6. Write a custom vertex shader that uses a trigonometric function (e.g. `sin`, `tan`) to non-uniformly modify your cube's vertex positions over time. This will necessitate instantiating an incrementing variable in your Typescript code that you pass to your shader every tick. Refer to the base code's methods of passing variables to shaders if you are unsure how to do so. -7. Feel free to update any of the files when writing your code. The implementation of the `OpenGLRenderer` is currently very simple. - -## Making a Live Demo -When you push changes to the `master` branch of your repository on Github, a Github workflow will run automatically which builds your code and pushes the build to a new branch `gh-pages`. The configuration file which handles this is located at `.github/workflows/build-and-deploy.yml`. If you want to modify this, you can read more about workflows [here](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions). - -Once your built code is pushed to `gh-pages`, Github can automatically publish a live site. Configure that by: - - 1. Open the Settings tab of your repository in Github. - - 2. Scroll down to the Pages tab of the Settings (in the table on the left) and choose which branch to make the source for the deployed project. This should be the `gh-pages` branch which is automatically created after the first successful build of the `master` branch. - - 3. Done! Now, any new commits on the `master` branch will be built and pushed to `gh-pages`. The project should be visible at http://username.github.io/repo-name. -  - -To check if everything is on the right track: - -1. Make sure the `gh-pages` branch of your repo has a files called `index.html`, `bundle.js`, and `bundle.js.map` - -2. In the settings tab of the repo, under Pages, make sure it says your site is published at some url. - -## Submission -1. Create a pull request to this repository with your completed code. -2. Update README.md to contain a solid description of your project with a screenshot of some visuals, and a link to your live demo. -3. Submit the link to your pull request on Canvas, and add a comment to your submission with a hyperlink to your live demo. -4. Include a link to your live site. - -## Resources -- Javascript modules https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import -- Typescript https://www.typescriptlang.org/docs/home.html -- dat.gui https://workshop.chromeexperiments.com/examples/gui/ -- glMatrix http://glmatrix.net/docs/ -- WebGL - - Interfaces https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API - - Types https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Types - - Constants https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants diff --git a/bundle.js b/bundle.js new file mode 100644 index 00000000..d5441c40 --- /dev/null +++ b/bundle.js @@ -0,0 +1,2 @@ +(()=>{var t={478:(t,e,n)=>{"use strict";t.exports=function(t,e){t=t||document.body;var n=[.01,1/0];"distanceLimits"in(e=e||{})&&(n[0]=e.distanceLimits[0],n[1]=e.distanceLimits[1]),"zoomMin"in e&&(n[0]=e.zoomMin),"zoomMax"in e&&(n[1]=e.zoomMax);var c=o({center:e.center||[0,0,0],up:e.up||[0,1,0],eye:e.eye||[0,0,10],mode:e.mode||"orbit",distanceLimits:n}),u=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],d=0,h=t.clientWidth,f=t.clientHeight,p={view:c,element:t,delay:e.delay||16,rotateSpeed:e.rotateSpeed||1,zoomSpeed:e.zoomSpeed||1,translateSpeed:e.translateSpeed||1,flipX:!!e.flipX,flipY:!!e.flipY,modes:c.modes,tick:function(){var e=i(),n=this.delay;c.idle(e-n),c.flush(e-(100+2*n));var o=e-2*n;c.recalcMatrix(o);for(var r=!0,s=c.computedMatrix,a=0;a<16;++a)r=r&&u[a]===s[a],u[a]=s[a];var l=t.clientWidth===h&&t.clientHeight===f;return h=t.clientWidth,f=t.clientHeight,r?!l:(d=Math.exp(c.computedRadius[0]),!0)},lookAt:function(t,e,n){c.lookAt(c.lastT(),t,e,n)},rotate:function(t,e,n){c.rotate(c.lastT(),t,e,n)},pan:function(t,e,n){c.pan(c.lastT(),t,e,n)},translate:function(t,e,n){c.translate(c.lastT(),t,e,n)}};Object.defineProperties(p,{matrix:{get:function(){return c.computedMatrix},set:function(t){return c.setMatrix(c.lastT(),t),c.computedMatrix},enumerable:!0},mode:{get:function(){return c.getMode()},set:function(t){return c.setMode(t),c.getMode()},enumerable:!0},center:{get:function(){return c.computedCenter},set:function(t){return c.lookAt(c.lastT(),t),c.computedCenter},enumerable:!0},eye:{get:function(){return c.computedEye},set:function(t){return c.lookAt(c.lastT(),null,t),c.computedEye},enumerable:!0},up:{get:function(){return c.computedUp},set:function(t){return c.lookAt(c.lastT(),null,null,t),c.computedUp},enumerable:!0},distance:{get:function(){return d},set:function(t){return c.setDistance(c.lastT(),t),t},enumerable:!0},distanceLimits:{get:function(){return c.getDistanceLimits(n)},set:function(t){return c.setDistanceLimits(t),t},enumerable:!0}}),t.addEventListener("contextmenu",(function(t){return t.preventDefault(),!1}));var m=0,_=0,v={shift:!1,control:!1,alt:!1,meta:!1};function g(e,n,o,r){var s=1/t.clientHeight,a=s*(n-m),l=s*(o-_),u=p.flipX?1:-1,h=p.flipY?1:-1,f=Math.PI*p.rotateSpeed,g=i();if(1&e)r.shift?c.rotate(g,0,0,-a*f):c.rotate(g,u*f*a,-h*f*l,0);else if(2&e)c.pan(g,-p.translateSpeed*a*d,p.translateSpeed*l*d,0);else if(4&e){var b=p.zoomSpeed*l/window.innerHeight*(g-c.lastT())*50;c.pan(g,0,0,d*(Math.exp(b)-1))}m=n,_=o,v=r}return r(t,g),t.addEventListener("touchstart",(function(e){var n=a(e.changedTouches[0],t);g(0,n[0],n[1],v),g(1,n[0],n[1],v),e.preventDefault()}),!!l&&{passive:!1}),t.addEventListener("touchmove",(function(e){var n=a(e.changedTouches[0],t);g(1,n[0],n[1],v),e.preventDefault()}),!!l&&{passive:!1}),t.addEventListener("touchend",(function(e){a(e.changedTouches[0],t),g(0,m,_,v),e.preventDefault()}),!!l&&{passive:!1}),s(t,(function(t,e,n){var o=p.flipX?1:-1,r=p.flipY?1:-1,s=i();if(Math.abs(t)>Math.abs(e))c.rotate(s,0,0,-t*o*Math.PI*p.rotateSpeed/window.innerWidth);else{var a=p.zoomSpeed*r*e/window.innerHeight*(s-c.lastT())/100;c.pan(s,0,0,d*(Math.exp(a)-1))}}),!0),p};var i=n(698),o=n(991),r=n(685),s=n(232),a=n(675),l=n(795)},991:(t,e,n)=>{"use strict";t.exports=function(t){var e=(t=t||{}).eye||[0,0,1],n=t.center||[0,0,0],a=t.up||[0,1,0],l=t.distanceLimits||[0,1/0],c=t.mode||"turntable",u=i(),d=o(),h=r();return u.setDistanceLimits(l[0],l[1]),u.lookAt(0,e,n,a),d.setDistanceLimits(l[0],l[1]),d.lookAt(0,e,n,a),h.setDistanceLimits(l[0],l[1]),h.lookAt(0,e,n,a),new s({turntable:u,orbit:d,matrix:h},c)};var i=n(786),o=n(809),r=n(622);function s(t,e){this._controllerNames=Object.keys(t),this._controllerList=this._controllerNames.map((function(e){return t[e]})),this._mode=e,this._active=t[e],this._active||(this._mode="turntable",this._active=t.turntable),this.modes=this._controllerNames,this.computedMatrix=this._active.computedMatrix,this.computedEye=this._active.computedEye,this.computedUp=this._active.computedUp,this.computedCenter=this._active.computedCenter,this.computedRadius=this._active.computedRadius}var a=s.prototype;a.flush=function(t){for(var e=this._controllerList,n=0;n{"use strict";function e(t,e,n,i,o){for(var r=o+1;i<=o;){var s=i+o>>>1,a=t[s];(void 0!==n?n(a,e):a-e)>=0?(r=s,o=s-1):i=s+1}return r}function n(t,e,n,i,o){for(var r=o+1;i<=o;){var s=i+o>>>1,a=t[s];(void 0!==n?n(a,e):a-e)>0?(r=s,o=s-1):i=s+1}return r}function i(t,e,n,i,o){for(var r=i-1;i<=o;){var s=i+o>>>1,a=t[s];(void 0!==n?n(a,e):a-e)<0?(r=s,i=s+1):o=s-1}return r}function o(t,e,n,i,o){for(var r=i-1;i<=o;){var s=i+o>>>1,a=t[s];(void 0!==n?n(a,e):a-e)<=0?(r=s,i=s+1):o=s-1}return r}function r(t,e,n,i,o){for(;i<=o;){var r=i+o>>>1,s=t[r],a=void 0!==n?n(s,e):s-e;if(0===a)return r;a<=0?i=r+1:o=r-1}return-1}function s(t,e,n,i,o,r){return"function"==typeof n?r(t,e,n,void 0===i?0:0|i,void 0===o?t.length-1:0|o):r(t,e,void 0,void 0===n?0:0|n,void 0===i?t.length-1:0|i)}t.exports={ge:function(t,n,i,o,r){return s(t,n,i,o,r,e)},gt:function(t,e,i,o,r){return s(t,e,i,o,r,n)},lt:function(t,e,n,o,r){return s(t,e,n,o,r,i)},le:function(t,e,n,i,r){return s(t,e,n,i,r,o)},eq:function(t,e,n,i,o){return s(t,e,n,i,o,r)}}},617:t=>{"use strict";t.exports=function(t,e,n,i,o,r){var s=o-1,a=o*o,l=s*s,c=(1+2*o)*l,u=o*l,d=a*(3-2*o),h=a*s;if(t.length){r||(r=new Array(t.length));for(var f=t.length-1;f>=0;--f)r[f]=c*t[f]+u*e[f]+d*n[f]+h*i[f];return r}return c*t+u*e+d*n+h*i},t.exports.derivative=function(t,e,n,i,o,r){var s=6*o*o-6*o,a=3*o*o-4*o+1,l=-6*o*o+6*o,c=3*o*o-2*o;if(t.length){r||(r=new Array(t.length));for(var u=t.length-1;u>=0;--u)r[u]=s*t[u]+a*e[u]+l*n[u]+c*i[u];return r}return s*t+a*e+l*n[u]+c*i}},173:(t,e,n)=>{"use strict";t.exports=function(t,e,n){switch(arguments.length){case 0:return new s([0],[0],0);case 1:return"number"==typeof t?new s(i=l(t),i,0):new s(t,l(t.length),0);case 2:var i;if("number"==typeof e)return new s(t,i=l(t.length),+e);n=0;case 3:if(t.length!==e.length)throw new Error("state and velocity lengths must match");return new s(t,e,n)}};var i=n(617),o=n(76);function r(t,e,n){return Math.min(e,Math.max(t,n))}function s(t,e,n){this.dimension=t.length,this.bounds=[new Array(this.dimension),new Array(this.dimension)];for(var i=0;i=n-1){h=l.length-1;var p=t-e[n-1];for(f=0;f=n-1)for(var u=a.length-1,d=(e[n-1],0);d=0;--n)if(t[--e])return!1;return!0},a.jump=function(t){var e=this.lastT(),n=this.dimension;if(!(t0;--d)i.push(r(l[d-1],c[d-1],arguments[d])),o.push(0)}},a.push=function(t){var e=this.lastT(),n=this.dimension;if(!(t1e-6?1/a:0;this._time.push(t);for(var h=n;h>0;--h){var f=r(c[h-1],u[h-1],arguments[h]);i.push(f),o.push((f-i[s++])*d)}}},a.set=function(t){var e=this.dimension;if(!(t0;--l)n.push(r(s[l-1],a[l-1],arguments[l])),i.push(0)}},a.move=function(t){var e=this.lastT(),n=this.dimension;if(!(t<=e||arguments.length!==n+1)){var i=this._state,o=this._velocity,s=i.length-this.dimension,a=this.bounds,l=a[0],c=a[1],u=t-e,d=u>1e-6?1/u:0;this._time.push(t);for(var h=n;h>0;--h){var f=arguments[h];i.push(r(l[h-1],c[h-1],i[s++]+f)),o.push(f*d)}}},a.idle=function(t){var e=this.lastT();if(!(t=0;--d)i.push(r(l[d],c[d],i[s]+u*o[s])),o.push(0),s+=1}}},447:t=>{t.exports=function(t){var e=new Float32Array(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}},252:t=>{t.exports=function(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},594:t=>{t.exports=function(t){var e=t[0],n=t[1],i=t[2],o=t[3],r=t[4],s=t[5],a=t[6],l=t[7],c=t[8],u=t[9],d=t[10],h=t[11],f=t[12],p=t[13],m=t[14],_=t[15];return(e*s-n*r)*(d*_-h*m)-(e*a-i*r)*(u*_-h*p)+(e*l-o*r)*(u*m-d*p)+(n*a-i*s)*(c*_-h*f)-(n*l-o*s)*(c*m-d*f)+(i*l-o*a)*(c*p-u*f)}},127:t=>{t.exports=function(t,e){var n=e[0],i=e[1],o=e[2],r=e[3],s=n+n,a=i+i,l=o+o,c=n*s,u=i*s,d=i*a,h=o*s,f=o*a,p=o*l,m=r*s,_=r*a,v=r*l;return t[0]=1-d-p,t[1]=u+v,t[2]=h-_,t[3]=0,t[4]=u-v,t[5]=1-c-p,t[6]=f+m,t[7]=0,t[8]=h+_,t[9]=f-m,t[10]=1-c-d,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},872:t=>{t.exports=function(t,e,n){var i=e[0],o=e[1],r=e[2],s=e[3],a=i+i,l=o+o,c=r+r,u=i*a,d=i*l,h=i*c,f=o*l,p=o*c,m=r*c,_=s*a,v=s*l,g=s*c;return t[0]=1-(f+m),t[1]=d+g,t[2]=h-v,t[3]=0,t[4]=d-g,t[5]=1-(u+m),t[6]=p+_,t[7]=0,t[8]=h+v,t[9]=p-_,t[10]=1-(u+f),t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t}},312:t=>{t.exports=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},481:t=>{t.exports=function(t,e){var n=e[0],i=e[1],o=e[2],r=e[3],s=e[4],a=e[5],l=e[6],c=e[7],u=e[8],d=e[9],h=e[10],f=e[11],p=e[12],m=e[13],_=e[14],v=e[15],g=n*a-i*s,b=n*l-o*s,y=n*c-r*s,w=i*l-o*a,x=i*c-r*a,E=o*c-r*l,A=u*m-d*p,M=u*_-h*p,C=u*v-f*p,T=d*_-h*m,S=d*v-f*m,R=h*v-f*_,k=g*R-b*S+y*T+w*C-x*M+E*A;return k?(k=1/k,t[0]=(a*R-l*S+c*T)*k,t[1]=(o*S-i*R-r*T)*k,t[2]=(m*E-_*x+v*w)*k,t[3]=(h*x-d*E-f*w)*k,t[4]=(l*C-s*R-c*M)*k,t[5]=(n*R-o*C+r*M)*k,t[6]=(_*y-p*E-v*b)*k,t[7]=(u*E-h*y+f*b)*k,t[8]=(s*S-a*C+c*A)*k,t[9]=(i*C-n*S-r*A)*k,t[10]=(p*x-m*y+v*g)*k,t[11]=(d*y-u*x-f*g)*k,t[12]=(a*M-s*T-l*A)*k,t[13]=(n*T-i*M+o*A)*k,t[14]=(m*b-p*w-_*g)*k,t[15]=(u*w-d*b+h*g)*k,t):null}},727:(t,e,n)=>{var i=n(312);t.exports=function(t,e,n,o){var r,s,a,l,c,u,d,h,f,p,m=e[0],_=e[1],v=e[2],g=o[0],b=o[1],y=o[2],w=n[0],x=n[1],E=n[2];return Math.abs(m-w)<1e-6&&Math.abs(_-x)<1e-6&&Math.abs(v-E)<1e-6?i(t):(d=m-w,h=_-x,f=v-E,r=b*(f*=p=1/Math.sqrt(d*d+h*h+f*f))-y*(h*=p),s=y*(d*=p)-g*f,a=g*h-b*d,(p=Math.sqrt(r*r+s*s+a*a))?(r*=p=1/p,s*=p,a*=p):(r=0,s=0,a=0),l=h*a-f*s,c=f*r-d*a,u=d*s-h*r,(p=Math.sqrt(l*l+c*c+u*u))?(l*=p=1/p,c*=p,u*=p):(l=0,c=0,u=0),t[0]=r,t[1]=l,t[2]=d,t[3]=0,t[4]=s,t[5]=c,t[6]=h,t[7]=0,t[8]=a,t[9]=u,t[10]=f,t[11]=0,t[12]=-(r*m+s*_+a*v),t[13]=-(l*m+c*_+u*v),t[14]=-(d*m+h*_+f*v),t[15]=1,t)}},401:t=>{t.exports=function(t,e,n){var i=e[0],o=e[1],r=e[2],s=e[3],a=e[4],l=e[5],c=e[6],u=e[7],d=e[8],h=e[9],f=e[10],p=e[11],m=e[12],_=e[13],v=e[14],g=e[15],b=n[0],y=n[1],w=n[2],x=n[3];return t[0]=b*i+y*a+w*d+x*m,t[1]=b*o+y*l+w*h+x*_,t[2]=b*r+y*c+w*f+x*v,t[3]=b*s+y*u+w*p+x*g,b=n[4],y=n[5],w=n[6],x=n[7],t[4]=b*i+y*a+w*d+x*m,t[5]=b*o+y*l+w*h+x*_,t[6]=b*r+y*c+w*f+x*v,t[7]=b*s+y*u+w*p+x*g,b=n[8],y=n[9],w=n[10],x=n[11],t[8]=b*i+y*a+w*d+x*m,t[9]=b*o+y*l+w*h+x*_,t[10]=b*r+y*c+w*f+x*v,t[11]=b*s+y*u+w*p+x*g,b=n[12],y=n[13],w=n[14],x=n[15],t[12]=b*i+y*a+w*d+x*m,t[13]=b*o+y*l+w*h+x*_,t[14]=b*r+y*c+w*f+x*v,t[15]=b*s+y*u+w*p+x*g,t}},397:t=>{t.exports=function(t,e,n,i){var o,r,s,a,l,c,u,d,h,f,p,m,_,v,g,b,y,w,x,E,A,M,C,T,S=i[0],R=i[1],k=i[2],L=Math.sqrt(S*S+R*R+k*k);return Math.abs(L)<1e-6?null:(S*=L=1/L,R*=L,k*=L,o=Math.sin(n),s=1-(r=Math.cos(n)),a=e[0],l=e[1],c=e[2],u=e[3],d=e[4],h=e[5],f=e[6],p=e[7],m=e[8],_=e[9],v=e[10],g=e[11],b=S*S*s+r,y=R*S*s+k*o,w=k*S*s-R*o,x=S*R*s-k*o,E=R*R*s+r,A=k*R*s+S*o,M=S*k*s+R*o,C=R*k*s-S*o,T=k*k*s+r,t[0]=a*b+d*y+m*w,t[1]=l*b+h*y+_*w,t[2]=c*b+f*y+v*w,t[3]=u*b+p*y+g*w,t[4]=a*x+d*E+m*A,t[5]=l*x+h*E+_*A,t[6]=c*x+f*E+v*A,t[7]=u*x+p*E+g*A,t[8]=a*M+d*C+m*T,t[9]=l*M+h*C+_*T,t[10]=c*M+f*C+v*T,t[11]=u*M+p*C+g*T,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t)}},663:t=>{t.exports=function(t,e,n){var i=Math.sin(n),o=Math.cos(n),r=e[4],s=e[5],a=e[6],l=e[7],c=e[8],u=e[9],d=e[10],h=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=r*o+c*i,t[5]=s*o+u*i,t[6]=a*o+d*i,t[7]=l*o+h*i,t[8]=c*o-r*i,t[9]=u*o-s*i,t[10]=d*o-a*i,t[11]=h*o-l*i,t}},113:t=>{t.exports=function(t,e,n){var i=Math.sin(n),o=Math.cos(n),r=e[0],s=e[1],a=e[2],l=e[3],c=e[8],u=e[9],d=e[10],h=e[11];return e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=r*o-c*i,t[1]=s*o-u*i,t[2]=a*o-d*i,t[3]=l*o-h*i,t[8]=r*i+c*o,t[9]=s*i+u*o,t[10]=a*i+d*o,t[11]=l*i+h*o,t}},974:t=>{t.exports=function(t,e,n){var i=Math.sin(n),o=Math.cos(n),r=e[0],s=e[1],a=e[2],l=e[3],c=e[4],u=e[5],d=e[6],h=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=r*o+c*i,t[1]=s*o+u*i,t[2]=a*o+d*i,t[3]=l*o+h*i,t[4]=c*o-r*i,t[5]=u*o-s*i,t[6]=d*o-a*i,t[7]=h*o-l*i,t}},28:t=>{t.exports=function(t,e,n){var i=n[0],o=n[1],r=n[2];return t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i,t[3]=e[3]*i,t[4]=e[4]*o,t[5]=e[5]*o,t[6]=e[6]*o,t[7]=e[7]*o,t[8]=e[8]*r,t[9]=e[9]*r,t[10]=e[10]*r,t[11]=e[11]*r,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},602:t=>{t.exports=function(t,e,n){var i,o,r,s,a,l,c,u,d,h,f,p,m=n[0],_=n[1],v=n[2];return e===t?(t[12]=e[0]*m+e[4]*_+e[8]*v+e[12],t[13]=e[1]*m+e[5]*_+e[9]*v+e[13],t[14]=e[2]*m+e[6]*_+e[10]*v+e[14],t[15]=e[3]*m+e[7]*_+e[11]*v+e[15]):(i=e[0],o=e[1],r=e[2],s=e[3],a=e[4],l=e[5],c=e[6],u=e[7],d=e[8],h=e[9],f=e[10],p=e[11],t[0]=i,t[1]=o,t[2]=r,t[3]=s,t[4]=a,t[5]=l,t[6]=c,t[7]=u,t[8]=d,t[9]=h,t[10]=f,t[11]=p,t[12]=i*m+a*_+d*v+e[12],t[13]=o*m+l*_+h*v+e[13],t[14]=r*m+c*_+f*v+e[14],t[15]=s*m+u*_+p*v+e[15]),t}},683:t=>{t.exports=function(t,e){if(t===e){var n=e[1],i=e[2],o=e[3],r=e[6],s=e[7],a=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=n,t[6]=e[9],t[7]=e[13],t[8]=i,t[9]=r,t[11]=e[14],t[12]=o,t[13]=s,t[14]=a}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t}},600:t=>{t.exports=function(t,e,n,i){var o,r,s,a,l,c=e[0],u=e[1],d=e[2],h=e[3],f=n[0],p=n[1],m=n[2],_=n[3];return(r=c*f+u*p+d*m+h*_)<0&&(r=-r,f=-f,p=-p,m=-m,_=-_),1-r>1e-6?(o=Math.acos(r),s=Math.sin(o),a=Math.sin((1-i)*o)/s,l=Math.sin(i*o)/s):(a=1-i,l=i),t[0]=a*c+l*f,t[1]=a*u+l*p,t[2]=a*d+l*m,t[3]=a*h+l*_,t}},858:t=>{t.exports=function(t,e,n){var i=e[0],o=e[1],r=e[2],s=n[0],a=n[1],l=n[2];return t[0]=o*l-r*a,t[1]=r*s-i*l,t[2]=i*a-o*s,t}},368:t=>{t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}},563:t=>{t.exports=function(t){var e=t[0],n=t[1],i=t[2];return Math.sqrt(e*e+n*n+i*i)}},919:t=>{t.exports=function(t,e,n,i){var o=e[0],r=e[1],s=e[2];return t[0]=o+i*(n[0]-o),t[1]=r+i*(n[1]-r),t[2]=s+i*(n[2]-s),t}},91:t=>{t.exports=function(t,e){var n=e[0],i=e[1],o=e[2],r=n*n+i*i+o*o;return r>0&&(r=1/Math.sqrt(r),t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r),t}},795:(t,e,n)=>{"use strict";var i=n(33);t.exports=i&&function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(e){t=!1}return t}()},33:t=>{t.exports=!0},805:(t,e,n)=>{var i=n(604),o=n(252),r=n(447),s=n(594),a=n(481),l=n(683),c={length:n(563),normalize:n(91),dot:n(368),cross:n(858)},u=o(),d=o(),h=[0,0,0,0],f=[[0,0,0],[0,0,0],[0,0,0]],p=[0,0,0];function m(t,e,n,i,o){t[0]=e[0]*i+n[0]*o,t[1]=e[1]*i+n[1]*o,t[2]=e[2]*i+n[2]*o}t.exports=function(t,e,n,o,_,v){if(e||(e=[0,0,0]),n||(n=[0,0,0]),o||(o=[0,0,0]),_||(_=[0,0,0,1]),v||(v=[0,0,0,1]),!i(u,t))return!1;if(r(d,u),d[3]=0,d[7]=0,d[11]=0,d[15]=1,Math.abs(s(d)<1e-8))return!1;var g,b,y,w,x,E,A,M=u[3],C=u[7],T=u[11],S=u[12],R=u[13],k=u[14],L=u[15];if(0!==M||0!==C||0!==T){if(h[0]=M,h[1]=C,h[2]=T,h[3]=L,!a(d,d))return!1;l(d,d),g=_,y=d,w=(b=h)[0],x=b[1],E=b[2],A=b[3],g[0]=y[0]*w+y[4]*x+y[8]*E+y[12]*A,g[1]=y[1]*w+y[5]*x+y[9]*E+y[13]*A,g[2]=y[2]*w+y[6]*x+y[10]*E+y[14]*A,g[3]=y[3]*w+y[7]*x+y[11]*E+y[15]*A}else _[0]=_[1]=_[2]=0,_[3]=1;if(e[0]=S,e[1]=R,e[2]=k,function(t,e){t[0][0]=e[0],t[0][1]=e[1],t[0][2]=e[2],t[1][0]=e[4],t[1][1]=e[5],t[1][2]=e[6],t[2][0]=e[8],t[2][1]=e[9],t[2][2]=e[10]}(f,u),n[0]=c.length(f[0]),c.normalize(f[0],f[0]),o[0]=c.dot(f[0],f[1]),m(f[1],f[1],f[0],1,-o[0]),n[1]=c.length(f[1]),c.normalize(f[1],f[1]),o[0]/=n[1],o[1]=c.dot(f[0],f[2]),m(f[2],f[2],f[0],1,-o[1]),o[2]=c.dot(f[1],f[2]),m(f[2],f[2],f[1],1,-o[2]),n[2]=c.length(f[2]),c.normalize(f[2],f[2]),o[1]/=n[2],o[2]/=n[2],c.cross(p,f[1],f[2]),c.dot(f[0],p)<0)for(var P=0;P<3;P++)n[P]*=-1,f[P][0]*=-1,f[P][1]*=-1,f[P][2]*=-1;return v[0]=.5*Math.sqrt(Math.max(1+f[0][0]-f[1][1]-f[2][2],0)),v[1]=.5*Math.sqrt(Math.max(1-f[0][0]+f[1][1]-f[2][2],0)),v[2]=.5*Math.sqrt(Math.max(1-f[0][0]-f[1][1]+f[2][2],0)),v[3]=.5*Math.sqrt(Math.max(1+f[0][0]+f[1][1]+f[2][2],0)),f[2][1]>f[1][2]&&(v[0]=-v[0]),f[0][2]>f[2][0]&&(v[1]=-v[1]),f[1][0]>f[0][1]&&(v[2]=-v[2]),!0}},604:t=>{t.exports=function(t,e){var n=e[15];if(0===n)return!1;for(var i=1/n,o=0;o<16;o++)t[o]=e[o]*i;return!0}},726:(t,e,n)=>{var i=n(919),o=n(814),r=n(805),s=n(594),a=n(210),l=d(),c=d(),u=d();function d(){return{translate:h(),scale:h(1),skew:h(),perspective:[0,0,0,1],quaternion:[0,0,0,1]}}function h(t){return[t||0,t||0,t||0]}t.exports=function(t,e,n,d){if(0===s(e)||0===s(n))return!1;var h=r(e,l.translate,l.scale,l.skew,l.perspective,l.quaternion),f=r(n,c.translate,c.scale,c.skew,c.perspective,c.quaternion);return!(!h||!f||(i(u.translate,l.translate,c.translate,d),i(u.skew,l.skew,c.skew,d),i(u.scale,l.scale,c.scale,d),i(u.perspective,l.perspective,c.perspective,d),a(u.quaternion,l.quaternion,c.quaternion,d),o(t,u.translate,u.scale,u.skew,u.perspective,u.quaternion),0))}},814:(t,e,n)=>{var i={identity:n(312),translate:n(602),multiply:n(401),create:n(252),scale:n(28),fromRotationTranslation:n(872)},o=(i.create(),i.create());t.exports=function(t,e,n,r,s,a){return i.identity(t),i.fromRotationTranslation(t,a,e),t[3]=s[0],t[7]=s[1],t[11]=s[2],t[15]=s[3],i.identity(o),0!==r[2]&&(o[9]=r[2],i.multiply(t,t,o)),0!==r[1]&&(o[9]=0,o[8]=r[1],i.multiply(t,t,o)),0!==r[0]&&(o[8]=0,o[4]=r[0],i.multiply(t,t,o)),i.scale(t,t,n),t}},622:(t,e,n)=>{"use strict";var i=n(76),o=n(726),r=n(481),s=n(663),a=n(113),l=n(974),c=n(727),u=n(602),d=(n(28),n(91)),h=[0,0,0];function f(t){this._components=t.slice(),this._time=[0],this.prevMatrix=t.slice(),this.nextMatrix=t.slice(),this.computedMatrix=t.slice(),this.computedInverse=t.slice(),this.computedEye=[0,0,0],this.computedUp=[0,0,0],this.computedCenter=[0,0,0],this.computedRadius=[0],this._limits=[-1/0,1/0]}t.exports=function(t){return new f((t=t||{}).matrix||[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};var p=f.prototype;p.recalcMatrix=function(t){var e=this._time,n=i.le(e,t),s=this.computedMatrix;if(!(n<0)){var a=this._components;if(n===e.length-1)for(var l=16*n,c=0;c<16;++c)s[c]=a[l++];else{var u=e[n+1]-e[n],h=(l=16*n,this.prevMatrix),f=!0;for(c=0;c<16;++c)h[c]=a[l++];var p=this.nextMatrix;for(c=0;c<16;++c)p[c]=a[l++],f=f&&h[c]===p[c];if(u<1e-6||f)for(c=0;c<16;++c)s[c]=h[c];else o(s,h,p,(t-e[n])/u)}var m=this.computedUp;m[0]=s[1],m[1]=s[5],m[2]=s[9],d(m,m);var _=this.computedInverse;r(_,s);var v=this.computedEye,g=_[15];v[0]=_[12]/g,v[1]=_[13]/g,v[2]=_[14]/g;var b=this.computedCenter,y=Math.exp(this.computedRadius[0]);for(c=0;c<3;++c)b[c]=v[c]-s[2+4*c]*y}},p.idle=function(t){if(!(t{"use strict";t.exports=function(t,e){e||(e=t,t=window);var n=0,o=0,r=0,s={shift:!1,alt:!1,control:!1,meta:!1},a=!1;function l(t){var e=!1;return"altKey"in t&&(e=e||t.altKey!==s.alt,s.alt=!!t.altKey),"shiftKey"in t&&(e=e||t.shiftKey!==s.shift,s.shift=!!t.shiftKey),"ctrlKey"in t&&(e=e||t.ctrlKey!==s.control,s.control=!!t.ctrlKey),"metaKey"in t&&(e=e||t.metaKey!==s.meta,s.meta=!!t.metaKey),e}function c(t,a){var c=i.x(a),u=i.y(a);"buttons"in a&&(t=0|a.buttons),(t!==n||c!==o||u!==r||l(a))&&(n=0|t,o=c||0,r=u||0,e&&e(n,o,r,s))}function u(t){c(0,t)}function d(){(n||o||r||s.shift||s.alt||s.meta||s.control)&&(o=r=0,n=0,s.shift=s.alt=s.control=s.meta=!1,e&&e(0,0,0,s))}function h(t){l(t)&&e&&e(n,o,r,s)}function f(t){0===i.buttons(t)?c(0,t):c(n,t)}function p(t){c(n|i.buttons(t),t)}function m(t){c(n&~i.buttons(t),t)}function _(){a||(a=!0,t.addEventListener("mousemove",f),t.addEventListener("mousedown",p),t.addEventListener("mouseup",m),t.addEventListener("mouseleave",u),t.addEventListener("mouseenter",u),t.addEventListener("mouseout",u),t.addEventListener("mouseover",u),t.addEventListener("blur",d),t.addEventListener("keyup",h),t.addEventListener("keydown",h),t.addEventListener("keypress",h),t!==window&&(window.addEventListener("blur",d),window.addEventListener("keyup",h),window.addEventListener("keydown",h),window.addEventListener("keypress",h)))}_();var v={element:t};return Object.defineProperties(v,{enabled:{get:function(){return a},set:function(e){e?_():a&&(a=!1,t.removeEventListener("mousemove",f),t.removeEventListener("mousedown",p),t.removeEventListener("mouseup",m),t.removeEventListener("mouseleave",u),t.removeEventListener("mouseenter",u),t.removeEventListener("mouseout",u),t.removeEventListener("mouseover",u),t.removeEventListener("blur",d),t.removeEventListener("keyup",h),t.removeEventListener("keydown",h),t.removeEventListener("keypress",h),t!==window&&(window.removeEventListener("blur",d),window.removeEventListener("keyup",h),window.removeEventListener("keydown",h),window.removeEventListener("keypress",h)))},enumerable:!0},buttons:{get:function(){return n},enumerable:!0},x:{get:function(){return o},enumerable:!0},y:{get:function(){return r},enumerable:!0},mods:{get:function(){return s},enumerable:!0}}),v};var i=n(294)},675:t=>{var e={left:0,top:0};t.exports=function(t,n,i){n=n||t.currentTarget||t.srcElement,Array.isArray(i)||(i=[0,0]);var o,r=t.clientX||0,s=t.clientY||0,a=(o=n)===window||o===document||o===document.body?e:o.getBoundingClientRect();return i[0]=r-a.left,i[1]=s-a.top,i}},294:(t,e)=>{"use strict";function n(t){return t.target||t.srcElement||window}e.buttons=function(t){if("object"==typeof t){if("buttons"in t)return t.buttons;if("which"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1<{"use strict";var i=n(810);t.exports=function(t,e,n){"function"==typeof t&&(n=!!e,e=t,t=window);var o=i("ex",t),r=function(t){n&&t.preventDefault();var i=t.deltaX||0,r=t.deltaY||0,s=t.deltaZ||0,a=1;switch(t.deltaMode){case 1:a=o;break;case 2:a=window.innerHeight}if(r*=a,s*=a,(i*=a)||r||s)return e(i,r,s,t)};return t.addEventListener("wheel",r),r}},918:t=>{"use strict";t.exports=function(t,e,n,i,o,r,s,a,l,c){var u=e+r+c;if(d>0){var d=Math.sqrt(u+1);t[0]=.5*(s-l)/d,t[1]=.5*(a-i)/d,t[2]=.5*(n-r)/d,t[3]=.5*d}else{var h=Math.max(e,r,c);d=Math.sqrt(2*h-u+1),e>=h?(t[0]=.5*d,t[1]=.5*(o+n)/d,t[2]=.5*(a+i)/d,t[3]=.5*(s-l)/d):r>=h?(t[0]=.5*(n+o)/d,t[1]=.5*d,t[2]=.5*(l+s)/d,t[3]=.5*(a-i)/d):(t[0]=.5*(i+a)/d,t[1]=.5*(s+l)/d,t[2]=.5*d,t[3]=.5*(n-o)/d)}return t}},809:(t,e,n)=>{"use strict";t.exports=function(t){var e=(t=t||{}).center||[0,0,0],n=t.rotation||[0,0,0,1],i=t.radius||1;e=[].slice.call(e,0,3),u(n=[].slice.call(n,0,4),n);var o=new d(n,e,Math.log(i));return o.setDistanceLimits(t.zoomMin,t.zoomMax),("eye"in t||"up"in t)&&o.lookAt(0,t.eye,t.center,t.up),o};var i=n(173),o=n(727),r=n(127),s=n(481),a=n(918);function l(t,e,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(n,2))}function c(t,e,n,i){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(n,2)+Math.pow(i,2))}function u(t,e){var n=e[0],i=e[1],o=e[2],r=e[3],s=c(n,i,o,r);s>1e-6?(t[0]=n/s,t[1]=i/s,t[2]=o/s,t[3]=r/s):(t[0]=t[1]=t[2]=0,t[3]=1)}function d(t,e,n){this.radius=i([n]),this.center=i(e),this.rotation=i(t),this.computedRadius=this.radius.curve(0),this.computedCenter=this.center.curve(0),this.computedRotation=this.rotation.curve(0),this.computedUp=[.1,0,0],this.computedEye=[.1,0,0],this.computedMatrix=[.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.recalcMatrix(0)}var h=d.prototype;h.lastT=function(){return Math.max(this.radius.lastT(),this.center.lastT(),this.rotation.lastT())},h.recalcMatrix=function(t){this.radius.curve(t),this.center.curve(t),this.rotation.curve(t);var e=this.computedRotation;u(e,e);var n=this.computedMatrix;r(n,e);var i=this.computedCenter,o=this.computedEye,s=this.computedUp,a=Math.exp(this.computedRadius[0]);o[0]=i[0]+a*n[2],o[1]=i[1]+a*n[6],o[2]=i[2]+a*n[10],s[0]=n[1],s[1]=n[5],s[2]=n[9];for(var l=0;l<3;++l){for(var c=0,d=0;d<3;++d)c+=n[l+4*d]*o[d];n[12+l]=-c}},h.getMatrix=function(t,e){this.recalcMatrix(t);var n=this.computedMatrix;if(e){for(var i=0;i<16;++i)e[i]=n[i];return e}return n},h.idle=function(t){this.center.idle(t),this.radius.idle(t),this.rotation.idle(t)},h.flush=function(t){this.center.flush(t),this.radius.flush(t),this.rotation.flush(t)},h.pan=function(t,e,n,i){e=e||0,n=n||0,i=i||0,this.recalcMatrix(t);var o=this.computedMatrix,r=o[1],s=o[5],a=o[9],c=l(r,s,a);r/=c,s/=c,a/=c;var u=o[0],d=o[4],h=o[8],f=u*r+d*s+h*a,p=l(u-=r*f,d-=s*f,h-=a*f);u/=p,d/=p,h/=p;var m=o[2],_=o[6],v=o[10],g=m*r+_*s+v*a,b=m*u+_*d+v*h,y=l(m-=g*r+b*u,_-=g*s+b*d,v-=g*a+b*h);m/=y,_/=y,v/=y;var w=u*e+r*n,x=d*e+s*n,E=h*e+a*n;this.center.move(t,w,x,E);var A=Math.exp(this.computedRadius[0]);A=Math.max(1e-4,A+i),this.radius.set(t,Math.log(A))},h.rotate=function(t,e,n,i){this.recalcMatrix(t),e=e||0,n=n||0;var o=this.computedMatrix,r=o[0],s=o[4],a=o[8],u=o[1],d=o[5],h=o[9],f=o[2],p=o[6],m=o[10],_=e*r+n*u,v=e*s+n*d,g=e*a+n*h,b=-(p*g-m*v),y=-(m*_-f*g),w=-(f*v-p*_),x=Math.sqrt(Math.max(0,1-Math.pow(b,2)-Math.pow(y,2)-Math.pow(w,2))),E=c(b,y,w,x);E>1e-6?(b/=E,y/=E,w/=E,x/=E):(b=y=w=0,x=1);var A=this.computedRotation,M=A[0],C=A[1],T=A[2],S=A[3],R=M*x+S*b+C*w-T*y,k=C*x+S*y+T*b-M*w,L=T*x+S*w+M*y-C*b,P=S*x-M*b-C*y-T*w;if(i){b=f,y=p,w=m;var O=Math.sin(i)/l(b,y,w);b*=O,y*=O,w*=O,P=P*(x=Math.cos(e))-(R=R*x+P*b+k*w-L*y)*b-(k=k*x+P*y+L*b-R*w)*y-(L=L*x+P*w+R*y-k*b)*w}var B=c(R,k,L,P);B>1e-6?(R/=B,k/=B,L/=B,P/=B):(R=k=L=0,P=1),this.rotation.set(t,R,k,L,P)},h.lookAt=function(t,e,n,i){this.recalcMatrix(t),n=n||this.computedCenter,e=e||this.computedEye,i=i||this.computedUp;var r=this.computedMatrix;o(r,e,n,i);var s=this.computedRotation;a(s,r[0],r[1],r[2],r[4],r[5],r[6],r[8],r[9],r[10]),u(s,s),this.rotation.set(t,s[0],s[1],s[2],s[3]);for(var l=0,c=0;c<3;++c)l+=Math.pow(n[c]-e[c],2);this.radius.set(t,.5*Math.log(Math.max(l,1e-6))),this.center.set(t,n[0],n[1],n[2])},h.translate=function(t,e,n,i){this.center.move(t,e||0,n||0,i||0)},h.setMatrix=function(t,e){var n=this.computedRotation;a(n,e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]),u(n,n),this.rotation.set(t,n[0],n[1],n[2],n[3]);var i=this.computedMatrix;s(i,e);var o=i[15];if(Math.abs(o)>1e-6){var r=i[12]/o,l=i[13]/o,c=i[14]/o;this.recalcMatrix(t);var d=Math.exp(this.computedRadius[0]);this.center.set(t,r-i[2]*d,l-i[6]*d,c-i[10]*d),this.radius.idle(t)}else this.center.idle(t),this.radius.idle(t)},h.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},h.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},h.getDistanceLimits=function(t){var e=this.radius.bounds;return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},h.toJSON=function(){return this.recalcMatrix(this.lastT()),{center:this.computedCenter.slice(),rotation:this.computedRotation.slice(),distance:Math.log(this.computedRadius[0]),zoomMin:this.radius.bounds[0][0],zoomMax:this.radius.bounds[1][0]}},h.fromJSON=function(t){var e=this.lastT(),n=t.center;n&&this.center.set(e,n[0],n[1],n[2]);var i=t.rotation;i&&this.rotation.set(e,i[0],i[1],i[2],i[3]);var o=t.distance;o&&o>0&&this.radius.set(e,Math.log(o)),this.setDistanceLimits(t.zoomMin,t.zoomMax)}},885:t=>{t.exports=function(t,e){e||(e=[0,""]),t=String(t);var n=parseFloat(t,10);return e[0]=n,e[1]=t.match(/[\d.\-\+]*\s*(.*)/)[1]||"",e}},210:(t,e,n)=>{t.exports=n(600)},698:(t,e,n)=>{t.exports=n.g.performance&&n.g.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date}},792:function(t){t.exports=function(){"use strict";var t=function(){var e=0,n=document.createElement("div");function i(t){return n.appendChild(t.dom),t}function o(t){for(var i=0;i{"use strict";var i=n(885);t.exports=a;var o=s("in",document.body);function r(t,e){var n=i(getComputedStyle(t).getPropertyValue(e));return n[0]*a(n[1],t)}function s(t,e){var n=document.createElement("div");n.style.height="128"+t,e.appendChild(n);var i=r(n,"height")/128;return e.removeChild(n),i}function a(t,e){if(!t)return null;switch(e=e||document.body,t=(t+""||"px").trim().toLowerCase(),e!==window&&e!==document||(e=document.body),t){case"%":return e.clientHeight/100;case"ch":case"ex":return s(t,e);case"em":return r(e,"font-size");case"rem":return r(document.body,"font-size");case"vw":return window.innerWidth/100;case"vh":return window.innerHeight/100;case"vmin":return Math.min(window.innerWidth,window.innerHeight)/100;case"vmax":return Math.max(window.innerWidth,window.innerHeight)/100;case"in":return o;case"cm":return o/2.54;case"mm":return o/25.4;case"pt":return o/72;case"pc":return o/6;case"px":return 1}var n=i(t);if(!isNaN(n[0])&&n[1]){var l=a(n[1],e);return"number"==typeof l?n[0]*l:null}return null}},786:(t,e,n)=>{"use strict";t.exports=function(t){var e=(t=t||{}).center||[0,0,0],n=t.up||[0,1,0],i=t.right||d(n),o=t.radius||1,r=t.theta||0,u=t.phi||0;if(e=[].slice.call(e,0,3),n=[].slice.call(n,0,3),a(n,n),i=[].slice.call(i,0,3),a(i,i),"eye"in t){var f=t.eye,p=[f[0]-e[0],f[1]-e[1],f[2]-e[2]];s(i,p,n),c(i[0],i[1],i[2])<1e-6?i=d(n):a(i,i),o=c(p[0],p[1],p[2]);var m=l(n,p)/o,_=l(i,p)/o;u=Math.acos(m),r=Math.acos(_)}return o=Math.log(o),new h(t.zoomMin,t.zoomMax,e,n,i,o,r,u)};var i=n(173),o=n(481),r=n(397),s=n(858),a=n(91),l=n(368);function c(t,e,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(n,2))}function u(t){return Math.min(1,Math.max(-1,t))}function d(t){var e=Math.abs(t[0]),n=Math.abs(t[1]),i=Math.abs(t[2]),o=[0,0,0];e>Math.max(n,i)?o[2]=1:n>Math.max(e,i)?o[0]=1:o[1]=1;for(var r=0,s=0,l=0;l<3;++l)r+=t[l]*t[l],s+=o[l]*t[l];for(l=0;l<3;++l)o[l]-=s/r*t[l];return a(o,o),o}function h(t,e,n,o,r,s,a,l){this.center=i(n),this.up=i(o),this.right=i(r),this.radius=i([s]),this.angle=i([a,l]),this.angle.bounds=[[-1/0,-Math.PI/2],[1/0,Math.PI/2]],this.setDistanceLimits(t,e),this.computedCenter=this.center.curve(0),this.computedUp=this.up.curve(0),this.computedRight=this.right.curve(0),this.computedRadius=this.radius.curve(0),this.computedAngle=this.angle.curve(0),this.computedToward=[0,0,0],this.computedEye=[0,0,0],this.computedMatrix=new Array(16);for(var c=0;c<16;++c)this.computedMatrix[c]=.5;this.recalcMatrix(0)}var f=h.prototype;f.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},f.getDistanceLimits=function(t){var e=this.radius.bounds[0];return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},f.recalcMatrix=function(t){this.center.curve(t),this.up.curve(t),this.right.curve(t),this.radius.curve(t),this.angle.curve(t);for(var e=this.computedUp,n=this.computedRight,i=0,o=0,r=0;r<3;++r)o+=e[r]*n[r],i+=e[r]*e[r];var l=Math.sqrt(i),u=0;for(r=0;r<3;++r)n[r]-=e[r]*o/i,u+=n[r]*n[r],e[r]/=l;var d=Math.sqrt(u);for(r=0;r<3;++r)n[r]/=d;var h=this.computedToward;s(h,e,n),a(h,h);var f=Math.exp(this.computedRadius[0]),p=this.computedAngle[0],m=this.computedAngle[1],_=Math.cos(p),v=Math.sin(p),g=Math.cos(m),b=Math.sin(m),y=this.computedCenter,w=_*g,x=v*g,E=b,A=-_*b,M=-v*b,C=g,T=this.computedEye,S=this.computedMatrix;for(r=0;r<3;++r){var R=w*n[r]+x*h[r]+E*e[r];S[4*r+1]=A*n[r]+M*h[r]+C*e[r],S[4*r+2]=R,S[4*r+3]=0}var k=S[1],L=S[5],P=S[9],O=S[2],B=S[6],F=S[10],N=L*F-P*B,D=P*O-k*F,I=k*B-L*O,U=c(N,D,I);for(N/=U,D/=U,I/=U,S[0]=N,S[4]=D,S[8]=I,r=0;r<3;++r)T[r]=y[r]+S[2+4*r]*f;for(r=0;r<3;++r){u=0;for(var H=0;H<3;++H)u+=S[r+4*H]*T[H];S[12+r]=-u}S[15]=1},f.getMatrix=function(t,e){this.recalcMatrix(t);var n=this.computedMatrix;if(e){for(var i=0;i<16;++i)e[i]=n[i];return e}return n};var p=[0,0,0];f.rotate=function(t,e,n,i){if(this.angle.move(t,e,n),i){this.recalcMatrix(t);var o=this.computedMatrix;p[0]=o[2],p[1]=o[6],p[2]=o[10];for(var s=this.computedUp,a=this.computedRight,l=this.computedToward,c=0;c<3;++c)o[4*c]=s[c],o[4*c+1]=a[c],o[4*c+2]=l[c];for(r(o,o,i,p),c=0;c<3;++c)s[c]=o[4*c],a[c]=o[4*c+1];this.up.set(t,s[0],s[1],s[2]),this.right.set(t,a[0],a[1],a[2])}},f.pan=function(t,e,n,i){e=e||0,n=n||0,i=i||0,this.recalcMatrix(t);var o=this.computedMatrix,r=(Math.exp(this.computedRadius[0]),o[1]),s=o[5],a=o[9],l=c(r,s,a);r/=l,s/=l,a/=l;var u=o[0],d=o[4],h=o[8],f=u*r+d*s+h*a,p=c(u-=r*f,d-=s*f,h-=a*f),m=(u/=p)*e+r*n,_=(d/=p)*e+s*n,v=(h/=p)*e+a*n;this.center.move(t,m,_,v);var g=Math.exp(this.computedRadius[0]);g=Math.max(1e-4,g+i),this.radius.set(t,Math.log(g))},f.translate=function(t,e,n,i){this.center.move(t,e||0,n||0,i||0)},f.setMatrix=function(t,e,n,i){var r=1;"number"==typeof n&&(r=0|n),(r<0||r>3)&&(r=1);var s=(r+2)%3;e||(this.recalcMatrix(t),e=this.computedMatrix);var a=e[r],l=e[r+4],d=e[r+8];if(i){var h=Math.abs(a),f=Math.abs(l),p=Math.abs(d),m=Math.max(h,f,p);h===m?(a=a<0?-1:1,l=d=0):p===m?(d=d<0?-1:1,a=l=0):(l=l<0?-1:1,a=d=0)}else{var _=c(a,l,d);a/=_,l/=_,d/=_}var v,g,b=e[s],y=e[s+4],w=e[s+8],x=b*a+y*l+w*d,E=c(b-=a*x,y-=l*x,w-=d*x),A=l*(w/=E)-d*(y/=E),M=d*(b/=E)-a*w,C=a*y-l*b,T=c(A,M,C);if(A/=T,M/=T,C/=T,this.center.jump(t,Y,G,W),this.radius.idle(t),this.up.jump(t,a,l,d),this.right.jump(t,b,y,w),2===r){var S=e[1],R=e[5],k=e[9],L=S*b+R*y+k*w,P=S*A+R*M+k*C;v=N<0?-Math.PI/2:Math.PI/2,g=Math.atan2(P,L)}else{var O=e[2],B=e[6],F=e[10],N=O*a+B*l+F*d,D=O*b+B*y+F*w,I=O*A+B*M+F*C;v=Math.asin(u(N)),g=Math.atan2(I,D)}this.angle.jump(t,g,v),this.recalcMatrix(t);var U=e[2],H=e[6],j=e[10],z=this.computedMatrix;o(z,e);var V=z[15],Y=z[12]/V,G=z[13]/V,W=z[14]/V,X=Math.exp(this.computedRadius[0]);this.center.jump(t,Y-U*X,G-H*X,W-j*X)},f.lastT=function(){return Math.max(this.center.lastT(),this.up.lastT(),this.right.lastT(),this.radius.lastT(),this.angle.lastT())},f.idle=function(t){this.center.idle(t),this.up.idle(t),this.right.idle(t),this.radius.idle(t),this.angle.idle(t)},f.flush=function(t){this.center.flush(t),this.up.flush(t),this.right.flush(t),this.radius.flush(t),this.angle.flush(t)},f.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},f.lookAt=function(t,e,n,i){this.recalcMatrix(t),e=e||this.computedEye,n=n||this.computedCenter;var o=(i=i||this.computedUp)[0],r=i[1],s=i[2],a=c(o,r,s);if(!(a<1e-6)){o/=a,r/=a,s/=a;var l=e[0]-n[0],d=e[1]-n[1],h=e[2]-n[2],f=c(l,d,h);if(!(f<1e-6)){l/=f,d/=f,h/=f;var p=this.computedRight,m=p[0],_=p[1],v=p[2],g=o*m+r*_+s*v,b=c(m-=g*o,_-=g*r,v-=g*s);if(!(b<.01&&(b=c(m=r*h-s*d,_=s*l-o*h,v=o*d-r*l))<1e-6)){m/=b,_/=b,v/=b,this.up.set(t,o,r,s),this.right.set(t,m,_,v),this.center.set(t,n[0],n[1],n[2]),this.radius.set(t,Math.log(f));var y=r*v-s*_,w=s*m-o*v,x=o*_-r*m,E=c(y,w,x),A=o*l+r*d+s*h,M=m*l+_*d+v*h,C=(y/=E)*l+(w/=E)*d+(x/=E)*h,T=Math.asin(u(A)),S=Math.atan2(C,M),R=this.angle._state,k=R[R.length-1],L=R[R.length-2];k%=2*Math.PI;var P=Math.abs(k+2*Math.PI-S),O=Math.abs(k-S),B=Math.abs(k-2*Math.PI-S);P{t.exports="#version 300 es\n\n// This is a fragment shader. If you've opened this file first, please\n// open and read lambert.vert.glsl before reading on.\n// Unlike the vertex shader, the fragment shader actually does compute\n// the shading of geometry. For every pixel in your program's output\n// screen, the fragment shader is run for every bit of geometry that\n// particular pixel overlaps. By implicitly interpolating the position\n// data passed into the fragment shader by the vertex shader, the fragment shader\n// can compute what color to apply to its pixel based on things like vertex\n// position, light position, and vertex color.\nprecision highp float;\n\nuniform vec4 u_Color; // The color with which to render this instance of geometry.\n\n// These are the interpolated values out of the rasterizer, so you can't know\n// their specific values without knowing the vertices that contributed to them\nin vec4 fs_Nor;\nin vec4 fs_LightVec;\nin vec4 fs_Col;\n\nin vec4 fs_Pos;\n\nout vec4 out_Col; // This is the final output color that you will see on your\n // screen for the pixel that is currently being processed.\n\nvec3 random3(vec3 p) {\n return fract(sin(vec3(dot(p, vec3(127.1, 311.7, 513.3)),\n dot(p, vec3(269.5, 183.3, 419.2)),\n dot(p, vec3(420.6, 631.2, 937.3))\n )) * 43758.5453);\n}\n\nfloat surflet(vec3 P, vec3 gridPoint) {\n // Compute falloff function by converting linear distance to a polynomial\n vec3 dist = abs(P - gridPoint);\n vec3 t = 1.0 - 6.0 * dist * dist * dist * dist * dist\n + 15.0 * dist * dist * dist * dist\n - 10.0 * dist * dist * dist;\n \n // Get the random vector for the grid point\n vec3 gradient = 2.0 * random3(gridPoint) - vec3(1.0);\n \n // Get the vector from the grid point to P\n vec3 diff = P - gridPoint;\n \n // Get the value of our height field by dotting grid->P with our gradient\n float height = dot(diff, gradient);\n \n // Scale our height field (i.e. reduce it) by our polynomial falloff function\n return height * t.x * t.y * t.z;\n}\n\nfloat perlinNoise(vec3 uvw) {\n float surfletSum = 0.0;\n \n // Iterate over the eight integer corners surrounding uvw\n for (int dx = 0; dx <= 1; ++dx) {\n for (int dy = 0; dy <= 1; ++dy) {\n for (int dz = 0; dz <= 1; ++dz) {\n // Construct the grid point in 3D\n vec3 gridPoint = floor(uvw) + vec3(dx, dy, dz);\n \n // Calculate the surflet contribution for this grid point\n surfletSum += surflet(uvw, gridPoint);\n }\n }\n }\n \n return surfletSum;\n}\n\n\n\nvoid main()\n{\n // Material base color (before shading)\n vec4 diffuseColor = u_Color;\n\n float perlinValue = 1.0 - perlinNoise(vec3(fs_Pos)/0.3);\n \n\n // Calculate the diffuse term for Lambert shading\n float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec));\n // Avoid negative lighting values\n // diffuseTerm = clamp(diffuseTerm, 0, 1);\n\n float ambientTerm = 0.2;\n\n float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier\n //to simulate ambient lighting. This ensures that faces that are not\n //lit by our point light are not completely black.\n\n\n diffuseColor *=perlinValue;\n\n // Compute final shaded color\n out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a);\n}\n"},776:t=>{t.exports="#version 300 es\n\n//This is a vertex shader. While it is called a \"shader\" due to outdated conventions, this file\n//is used to apply matrix transformations to the arrays of vertex data passed to it.\n//Since this code is run on your GPU, each vertex is transformed simultaneously.\n//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time.\n//This simultaneous transformation allows your program to run much faster, especially when rendering\n//geometry with millions of vertices.\n\nuniform mat4 u_Model; // The matrix that defines the transformation of the\n // object we're rendering. In this assignment,\n // this will be the result of traversing your scene graph.\n\nuniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix.\n // This allows us to transform the object's normals properly\n // if the object has been non-uniformly scaled.\n\nuniform mat4 u_ViewProj; // The matrix that defines the camera's transformation.\n // We've written a static matrix for you to use for HW2,\n // but in HW3 you'll have to generate one yourself\n\nuniform float u_Time;\n\nin vec4 vs_Pos; // The array of vertex positions passed to the shader\n\nin vec4 vs_Nor; // The array of vertex normals passed to the shader\n\nin vec4 vs_Col; // The array of vertex colors passed to the shader.\n\nout vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader.\nout vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader.\nout vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader.\nout vec4 fs_Pos;\n\nconst vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of\n //the geometry in the fragment shader.\n\nvec2 random2( vec2 p ) {\n return fract(sin(vec2(dot(p, vec2(127.1, 311.7)),\n dot(p, vec2(269.5,183.3))))\n * 43758.5453);\n}\n\nfloat WorleyNoise(vec2 uv) {\n uv *= 10.0; // Now the space is 10x10 instead of 1x1. Change this to any number you want.\n vec2 uvInt = floor(uv);\n vec2 uvFract = fract(uv);\n float minDist = 1.0; // Minimum distance initialized to max.\n for(int y = -1; y <= 1; ++y) {\n for(int x = -1; x <= 1; ++x) {\n vec2 neighbor = vec2(float(x), float(y)); // Direction in which neighbor cell lies\n vec2 point = random2(uvInt + neighbor); // Get the Voronoi centerpoint for the neighboring cell\n vec2 diff = neighbor + point - uvFract; // Distance between fragment coord and neighbor’s Voronoi point\n float dist = length(diff);\n minDist = min(minDist, dist);\n }\n }\n return minDist;\n}\n\n\n\n\nvoid main()\n{\n fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation\n\n mat3 invTranspose = mat3(u_ModelInvTr);\n fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation.\n // Transform the geometry's normals by the inverse transpose of the\n // model matrix. This is necessary to ensure the normals remain\n // perpendicular to the surface after the surface is transformed by\n // the model matrix.\n\n \n vec4 pos = vs_Pos;\n //pos += vec4( vec3(pos) + 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) +0.5 , cos(u_Time/150.0))) , 0.f);\n\n\n vec4 modelposition = u_Model * pos; // Temporarily store the transformed vertex positions for use below\n\n modelposition.x += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) + modelposition.x , cos(u_Time/150.0)));\n modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + modelposition.y ));\n\n modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0);\n\n fs_Pos = modelposition;\n\n fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies\n\n gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is\n // used to render the final positions of the geometry's vertices\n}\n"}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var r=e[i]={exports:{}};return t[i].call(r.exports,r,r.exports,n),r.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),(()=>{"use strict";var t,e=1e-6,i="undefined"!=typeof Float32Array?Float32Array:Array;function o(){var t=new i(3);return i!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function r(t,e,n){var o=new i(3);return o[0]=t,o[1]=e,o[2]=n,o}function s(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t}function a(t,e,n,o){var r=new i(4);return r[0]=t,r[1]=e,r[2]=n,r[3]=o,r}function l(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t[2]=e[2]+n[2],t[3]=e[3]+n[3],t}function c(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t[2]=e[2]+n[2]*i,t[3]=e[3]+n[3]*i,t}function u(t,e){var n=e[0],i=e[1],o=e[2],r=e[3],s=n*n+i*i+o*o+r*r;return s>0&&(s=1/Math.sqrt(s)),t[0]=n*s,t[1]=i*s,t[2]=o*s,t[3]=r*s,t}function d(t,e){var n=t.__state.conversionName.toString(),i=Math.round(t.r),o=Math.round(t.g),r=Math.round(t.b),s=t.a,a=Math.round(t.h),l=t.s.toFixed(1),c=t.v.toFixed(1);if(e||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var u=t.hex.toString(16);u.length<6;)u="0"+u;return"#"+u}return"CSS_RGB"===n?"rgb("+i+","+o+","+r+")":"CSS_RGBA"===n?"rgba("+i+","+o+","+r+","+s+")":"HEX"===n?"0x"+t.hex.toString(16):"RGB_ARRAY"===n?"["+i+","+o+","+r+"]":"RGBA_ARRAY"===n?"["+i+","+o+","+r+","+s+"]":"RGB_OBJ"===n?"{r:"+i+",g:"+o+",b:"+r+"}":"RGBA_OBJ"===n?"{r:"+i+",g:"+o+",b:"+r+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+a+",s:"+l+",v:"+c+"}":"HSVA_OBJ"===n?"{h:"+a+",s:"+l+",v:"+c+",a:"+s+"}":"unknown format"}Math.random,Math.PI,Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)}),o(),t=new i(4),i!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0);var h=Array.prototype.forEach,f=Array.prototype.slice,p={BREAK:{},extend:function(t){return this.each(f.call(arguments,1),(function(e){(this.isObject(e)?Object.keys(e):[]).forEach(function(n){this.isUndefined(e[n])||(t[n]=e[n])}.bind(this))}),this),t},defaults:function(t){return this.each(f.call(arguments,1),(function(e){(this.isObject(e)?Object.keys(e):[]).forEach(function(n){this.isUndefined(t[n])&&(t[n]=e[n])}.bind(this))}),this),t},compose:function(){var t=f.call(arguments);return function(){for(var e=f.call(arguments),n=t.length-1;n>=0;n--)e=[t[n].apply(this,e)];return e[0]}},each:function(t,e,n){if(t)if(h&&t.forEach&&t.forEach===h)t.forEach(e,n);else if(t.length===t.length+0){var i,o=void 0;for(o=0,i=t.length;o1?p.toArray(arguments):arguments[0];return p.each(m,(function(e){if(e.litmus(t))return p.each(e.conversions,(function(e,n){if(_=e.read(t),!1===v&&!1!==_)return v=_,_.conversionName=n,_.conversion=e,p.BREAK})),p.BREAK})),v},b=void 0,y={hsv_to_rgb:function(t,e,n){var i=Math.floor(t/60)%6,o=t/60-Math.floor(t/60),r=n*(1-e),s=n*(1-o*e),a=n*(1-(1-o)*e),l=[[n,a,r],[s,n,r],[r,n,a],[r,s,n],[a,r,n],[n,r,s]][i];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(t,e,n){var i=Math.min(t,e,n),o=Math.max(t,e,n),r=o-i,s=void 0;return 0===o?{h:NaN,s:0,v:0}:(s=t===o?(e-n)/r:e===o?2+(n-t)/r:4+(t-e)/r,(s/=6)<0&&(s+=1),{h:360*s,s:r/o,v:o/255})},rgb_to_hex:function(t,e,n){var i=this.hex_with_component(0,2,t);return i=this.hex_with_component(i,1,e),this.hex_with_component(i,0,n)},component_from_hex:function(t,e){return t>>8*e&255},hex_with_component:function(t,e,n){return n<<(b=8*e)|t&~(255<-1?e.length-e.indexOf(".")-1:0}var U=function(t){function e(t,n,i){x(this,e);var o=C(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n)),r=i||{};return o.__min=r.min,o.__max=r.max,o.__step=r.step,p.isUndefined(o.__step)?0===o.initialValue?o.__impliedStep=1:o.__impliedStep=Math.pow(10,Math.floor(Math.log(Math.abs(o.initialValue))/Math.LN10))/10:o.__impliedStep=o.__step,o.__precision=I(o.__impliedStep),o}return M(e,t),E(e,[{key:"setValue",value:function(t){var n=t;return void 0!==this.__min&&nthis.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),A(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(t){return this.__min=t,this}},{key:"max",value:function(t){return this.__max=t,this}},{key:"step",value:function(t){return this.__step=t,this.__impliedStep=t,this.__precision=I(t),this}}]),e}(k),H=function(t){function e(t,n,i){x(this,e);var o=C(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n,i));o.__truncationSuspended=!1;var r=o,s=void 0;function a(){r.__onFinishChange&&r.__onFinishChange.call(r,r.getValue())}function l(t){var e=s-t.clientY;r.setValue(r.getValue()+e*r.__impliedStep),s=t.clientY}function c(){B.unbind(window,"mousemove",l),B.unbind(window,"mouseup",c),a()}return o.__input=document.createElement("input"),o.__input.setAttribute("type","text"),B.bind(o.__input,"change",(function(){var t=parseFloat(r.__input.value);p.isNaN(t)||r.setValue(t)})),B.bind(o.__input,"blur",(function(){a()})),B.bind(o.__input,"mousedown",(function(t){B.bind(window,"mousemove",l),B.bind(window,"mouseup",c),s=t.clientY})),B.bind(o.__input,"keydown",(function(t){13===t.keyCode&&(r.__truncationSuspended=!0,this.blur(),r.__truncationSuspended=!1,a())})),o.updateDisplay(),o.domElement.appendChild(o.__input),o}return M(e,t),E(e,[{key:"updateDisplay",value:function(){var t,n,i;return this.__input.value=this.__truncationSuspended?this.getValue():(t=this.getValue(),n=this.__precision,i=Math.pow(10,n),Math.round(t*i)/i),A(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"updateDisplay",this).call(this)}}]),e}(U);function j(t,e,n,i,o){return i+(t-e)/(n-e)*(o-i)}var z=function(t){function e(t,n,i,o,r){x(this,e);var s=C(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n,{min:i,max:o,step:r})),a=s;function l(t){t.preventDefault();var e=a.__background.getBoundingClientRect();return a.setValue(j(t.clientX,e.left,e.right,a.__min,a.__max)),!1}function c(){B.unbind(window,"mousemove",l),B.unbind(window,"mouseup",c),a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())}function u(t){var e=t.touches[0].clientX,n=a.__background.getBoundingClientRect();a.setValue(j(e,n.left,n.right,a.__min,a.__max))}function d(){B.unbind(window,"touchmove",u),B.unbind(window,"touchend",d),a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())}return s.__background=document.createElement("div"),s.__foreground=document.createElement("div"),B.bind(s.__background,"mousedown",(function(t){document.activeElement.blur(),B.bind(window,"mousemove",l),B.bind(window,"mouseup",c),l(t)})),B.bind(s.__background,"touchstart",(function(t){1===t.touches.length&&(B.bind(window,"touchmove",u),B.bind(window,"touchend",d),u(t))})),B.addClass(s.__background,"slider"),B.addClass(s.__foreground,"slider-fg"),s.updateDisplay(),s.__background.appendChild(s.__foreground),s.domElement.appendChild(s.__background),s}return M(e,t),E(e,[{key:"updateDisplay",value:function(){var t=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*t+"%",A(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"updateDisplay",this).call(this)}}]),e}(U),V=function(t){function e(t,n,i){x(this,e);var o=C(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n)),r=o;return o.__button=document.createElement("div"),o.__button.innerHTML=void 0===i?"Fire":i,B.bind(o.__button,"click",(function(t){return t.preventDefault(),r.fire(),!1})),B.addClass(o.__button,"button"),o.domElement.appendChild(o.__button),o}return M(e,t),E(e,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),e}(k),Y=function(t){function e(t,n){x(this,e);var i=C(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));i.__color=new T(i.getValue()),i.__temp=new T(0);var o=i;i.domElement=document.createElement("div"),B.makeSelectable(i.domElement,!1),i.__selector=document.createElement("div"),i.__selector.className="selector",i.__saturation_field=document.createElement("div"),i.__saturation_field.className="saturation-field",i.__field_knob=document.createElement("div"),i.__field_knob.className="field-knob",i.__field_knob_border="2px solid ",i.__hue_knob=document.createElement("div"),i.__hue_knob.className="hue-knob",i.__hue_field=document.createElement("div"),i.__hue_field.className="hue-field",i.__input=document.createElement("input"),i.__input.type="text",i.__input_textShadow="0 1px 1px ",B.bind(i.__input,"keydown",(function(t){13===t.keyCode&&d.call(this)})),B.bind(i.__input,"blur",d),B.bind(i.__selector,"mousedown",(function(){B.addClass(this,"drag").bind(window,"mouseup",(function(){B.removeClass(o.__selector,"drag")}))})),B.bind(i.__selector,"touchstart",(function(){B.addClass(this,"drag").bind(window,"touchend",(function(){B.removeClass(o.__selector,"drag")}))}));var r,s=document.createElement("div");function a(t){f(t),B.bind(window,"mousemove",f),B.bind(window,"touchmove",f),B.bind(window,"mouseup",c),B.bind(window,"touchend",c)}function l(t){m(t),B.bind(window,"mousemove",m),B.bind(window,"touchmove",m),B.bind(window,"mouseup",u),B.bind(window,"touchend",u)}function c(){B.unbind(window,"mousemove",f),B.unbind(window,"touchmove",f),B.unbind(window,"mouseup",c),B.unbind(window,"touchend",c),h()}function u(){B.unbind(window,"mousemove",m),B.unbind(window,"touchmove",m),B.unbind(window,"mouseup",u),B.unbind(window,"touchend",u),h()}function d(){var t=g(this.value);!1!==t?(o.__color.__state=t,o.setValue(o.__color.toOriginal())):this.value=o.__color.toString()}function h(){o.__onFinishChange&&o.__onFinishChange.call(o,o.__color.toOriginal())}function f(t){-1===t.type.indexOf("touch")&&t.preventDefault();var e=o.__saturation_field.getBoundingClientRect(),n=t.touches&&t.touches[0]||t,i=n.clientX,r=n.clientY,s=(i-e.left)/(e.right-e.left),a=1-(r-e.top)/(e.bottom-e.top);return a>1?a=1:a<0&&(a=0),s>1?s=1:s<0&&(s=0),o.__color.v=a,o.__color.s=s,o.setValue(o.__color.toOriginal()),!1}function m(t){-1===t.type.indexOf("touch")&&t.preventDefault();var e=o.__hue_field.getBoundingClientRect(),n=1-((t.touches&&t.touches[0]||t).clientY-e.top)/(e.bottom-e.top);return n>1?n=1:n<0&&(n=0),o.__color.h=360*n,o.setValue(o.__color.toOriginal()),!1}return p.extend(i.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),p.extend(i.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:i.__field_knob_border+(i.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),p.extend(i.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),p.extend(i.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),p.extend(s.style,{width:"100%",height:"100%",background:"none"}),W(s,"top","rgba(0,0,0,0)","#000"),p.extend(i.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),(r=i.__hue_field).style.background="",r.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",r.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",r.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",r.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",r.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",p.extend(i.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:i.__input_textShadow+"rgba(0,0,0,0.7)"}),B.bind(i.__saturation_field,"mousedown",a),B.bind(i.__saturation_field,"touchstart",a),B.bind(i.__field_knob,"mousedown",a),B.bind(i.__field_knob,"touchstart",a),B.bind(i.__hue_field,"mousedown",l),B.bind(i.__hue_field,"touchstart",l),i.__saturation_field.appendChild(s),i.__selector.appendChild(i.__field_knob),i.__selector.appendChild(i.__saturation_field),i.__selector.appendChild(i.__hue_field),i.__hue_field.appendChild(i.__hue_knob),i.domElement.appendChild(i.__input),i.domElement.appendChild(i.__selector),i.updateDisplay(),i}return M(e,t),E(e,[{key:"updateDisplay",value:function(){var t=g(this.getValue());if(!1!==t){var e=!1;p.each(T.COMPONENTS,(function(n){if(!p.isUndefined(t[n])&&!p.isUndefined(this.__color.__state[n])&&t[n]!==this.__color.__state[n])return e=!0,{}}),this),e&&p.extend(this.__color.__state,t)}p.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,i=255-n;p.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,W(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),p.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+i+","+i+","+i+",.7)"})}}]),e}(k),G=["-moz-","-o-","-webkit-","-ms-",""];function W(t,e,n,i){t.style.background="",p.each(G,(function(o){t.style.cssText+="background: "+o+"linear-gradient("+e+", "+n+" 0%, "+i+" 100%); "}))}var X=function(t,e){var n=t[e];return p.isArray(arguments[2])||p.isObject(arguments[2])?new N(t,e,arguments[2]):p.isNumber(n)?p.isNumber(arguments[2])&&p.isNumber(arguments[3])?p.isNumber(arguments[4])?new z(t,e,arguments[2],arguments[3],arguments[4]):new z(t,e,arguments[2],arguments[3]):p.isNumber(arguments[4])?new H(t,e,{min:arguments[2],max:arguments[3],step:arguments[4]}):new H(t,e,{min:arguments[2],max:arguments[3]}):p.isString(n)?new D(t,e):p.isFunction(n)?new V(t,e,""):p.isBoolean(n)?new F(t,e):null},q=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,1e3/60)},K=function(){function t(){x(this,t),this.backgroundElement=document.createElement("div"),p.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),B.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),p.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var e=this;B.bind(this.backgroundElement,"click",(function(){e.hide()}))}return E(t,[{key:"show",value:function(){var t=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),p.defer((function(){t.backgroundElement.style.opacity=1,t.domElement.style.opacity=1,t.domElement.style.webkitTransform="scale(1)"}))}},{key:"hide",value:function(){var t=this,e=function e(){t.domElement.style.display="none",t.backgroundElement.style.display="none",B.unbind(t.domElement,"webkitTransitionEnd",e),B.unbind(t.domElement,"transitionend",e),B.unbind(t.domElement,"oTransitionEnd",e)};B.bind(this.domElement,"webkitTransitionEnd",e),B.bind(this.domElement,"transitionend",e),B.bind(this.domElement,"oTransitionEnd",e),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-B.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-B.getHeight(this.domElement)/2+"px"}}]),t}();!function(t,e){var n=e||document,i=document.createElement("style");i.type="text/css",i.innerHTML=t;var o=n.getElementsByTagName("head")[0];try{o.appendChild(i)}catch(t){}}(function(t){if(t&&"undefined"!=typeof window){var e=document.createElement("style");return e.setAttribute("type","text/css"),e.innerHTML=t,document.head.appendChild(e),t}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"));var J="Default",Q=function(){try{return!!window.localStorage}catch(t){return!1}}(),Z=void 0,$=!0,tt=void 0,et=!1,nt=[],it=function t(e){var n=this,i=e||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),B.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],i=p.defaults(i,{closeOnTop:!1,autoPlace:!0,width:t.DEFAULT_WIDTH}),i=p.defaults(i,{resizable:i.autoPlace,hideable:i.autoPlace}),p.isUndefined(i.load)?i.load={preset:J}:i.preset&&(i.load.preset=i.preset),p.isUndefined(i.parent)&&i.hideable&&nt.push(this),i.resizable=p.isUndefined(i.parent)&&i.resizable,i.autoPlace&&p.isUndefined(i.scrollable)&&(i.scrollable=!0);var o,r=Q&&"true"===localStorage.getItem(ct(0,"isLocal")),s=void 0,a=void 0;if(Object.defineProperties(this,{parent:{get:function(){return i.parent}},scrollable:{get:function(){return i.scrollable}},autoPlace:{get:function(){return i.autoPlace}},closeOnTop:{get:function(){return i.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:i.load.preset},set:function(t){n.parent?n.getRoot().preset=t:i.load.preset=t,function(t){for(var e=0;e1){var i=n.__li.nextElementSibling;return n.remove(),lt(t,n.object,n.property,{before:i,factoryArgs:[p.toArray(arguments)]})}if(p.isArray(e)||p.isObject(e)){var o=n.__li.nextElementSibling;return n.remove(),lt(t,n.object,n.property,{before:o,factoryArgs:[e]})}},name:function(t){return n.__li.firstElementChild.firstElementChild.innerHTML=t,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof z){var i=new H(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});p.each(["updateDisplay","onChange","onFinishChange","step","min","max"],(function(t){var e=n[t],o=i[t];n[t]=i[t]=function(){var t=Array.prototype.slice.call(arguments);return o.apply(i,t),e.apply(n,t)}})),B.addClass(e,"has-slider"),n.domElement.insertBefore(i.domElement,n.domElement.firstElementChild)}else if(n instanceof H){var o=function(e){if(p.isNumber(n.__min)&&p.isNumber(n.__max)){var i=n.__li.firstElementChild.firstElementChild.innerHTML,o=n.__gui.__listening.indexOf(n)>-1;n.remove();var r=lt(t,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return r.name(i),o&&r.listen(),r}return e};n.min=p.compose(o,n.min),n.max=p.compose(o,n.max)}else n instanceof F?(B.bind(e,"click",(function(){B.fakeEvent(n.__checkbox,"click")})),B.bind(n.__checkbox,"click",(function(t){t.stopPropagation()}))):n instanceof V?(B.bind(e,"click",(function(){B.fakeEvent(n.__button,"click")})),B.bind(e,"mouseover",(function(){B.addClass(n.__button,"hover")})),B.bind(e,"mouseout",(function(){B.removeClass(n.__button,"hover")}))):n instanceof Y&&(B.addClass(e,"color"),n.updateDisplay=p.compose((function(t){return e.style.borderLeftColor=n.__color.toString(),t}),n.updateDisplay),n.updateDisplay());n.setValue=p.compose((function(e){return t.getRoot().__preset_select&&n.isModified()&&st(t.getRoot(),!0),e}),n.setValue)}(t,l,o),t.__controllers.push(o),o}function ct(t,e){return document.location.href+"."+e}function ut(t,e,n){var i=document.createElement("option");i.innerHTML=e,i.value=e,t.__preset_select.appendChild(i),n&&(t.__preset_select.selectedIndex=t.__preset_select.length-1)}function dt(t,e){e.style.display=t.useLocalStorage?"block":"none"}function ht(t){var e=void 0;function n(n){return n.preventDefault(),t.width+=e-n.clientX,t.onResize(),e=n.clientX,!1}function i(){B.removeClass(t.__closeButton,it.CLASS_DRAG),B.unbind(window,"mousemove",n),B.unbind(window,"mouseup",i)}function o(o){return o.preventDefault(),e=o.clientX,B.addClass(t.__closeButton,it.CLASS_DRAG),B.bind(window,"mousemove",n),B.bind(window,"mouseup",i),!1}t.__resize_handle=document.createElement("div"),p.extend(t.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),B.bind(t.__resize_handle,"mousedown",o),B.bind(t.__closeButton,"mousedown",o),t.domElement.insertBefore(t.__resize_handle,t.domElement.firstElementChild)}function ft(t,e){t.domElement.style.width=e+"px",t.__save_row&&t.autoPlace&&(t.__save_row.style.width=e+"px"),t.__closeButton&&(t.__closeButton.style.width=e+"px")}function pt(t,e){var n={};return p.each(t.__rememberedObjects,(function(i,o){var r={},s=t.__rememberedObjectIndecesToControllers[o];p.each(s,(function(t,n){r[n]=e?t.initialValue:t.getValue()})),n[o]=r})),n}function mt(t){0!==t.length&&q.call(window,(function(){mt(t)})),p.each(t,(function(t){t.updateDisplay()}))}it.toggleHide=function(){et=!et,p.each(nt,(function(t){t.domElement.style.display=et?"none":""}))},it.CLASS_AUTO_PLACE="a",it.CLASS_AUTO_PLACE_CONTAINER="ac",it.CLASS_MAIN="main",it.CLASS_CONTROLLER_ROW="cr",it.CLASS_TOO_TALL="taller-than-window",it.CLASS_CLOSED="closed",it.CLASS_CLOSE_BUTTON="close-button",it.CLASS_CLOSE_TOP="close-top",it.CLASS_CLOSE_BOTTOM="close-bottom",it.CLASS_DRAG="drag",it.DEFAULT_WIDTH=245,it.TEXT_CLOSED="Close Controls",it.TEXT_OPEN="Open Controls",it._keydownHandler=function(t){"text"===document.activeElement.type||72!==t.which&&72!==t.keyCode||it.toggleHide()},B.bind(window,"keydown",it._keydownHandler,!1),p.extend(it.prototype,{add:function(t,e){return lt(this,t,e,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(t,e){return lt(this,t,e,{color:!0})},remove:function(t){this.__ul.removeChild(t.__li),this.__controllers.splice(this.__controllers.indexOf(t),1);var e=this;p.defer((function(){e.onResize()}))},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&tt.removeChild(this.domElement);var t=this;p.each(this.__folders,(function(e){t.removeFolder(e)})),B.unbind(window,"keydown",it._keydownHandler,!1),rt(this)},addFolder:function(t){if(void 0!==this.__folders[t])throw new Error('You already have a folder in this GUI by the name "'+t+'"');var e={name:t,parent:this};e.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[t]&&(e.closed=this.load.folders[t].closed,e.load=this.load.folders[t]);var n=new it(e);this.__folders[t]=n;var i=ot(this,n.domElement);return B.addClass(i,"folder"),n},removeFolder:function(t){this.__ul.removeChild(t.domElement.parentElement),delete this.__folders[t.name],this.load&&this.load.folders&&this.load.folders[t.name]&&delete this.load.folders[t.name],rt(t);var e=this;p.each(t.__folders,(function(e){t.removeFolder(e)})),p.defer((function(){e.onResize()}))},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var t=this.getRoot();if(t.scrollable){var e=B.getOffset(t.__ul).top,n=0;p.each(t.__ul.childNodes,(function(e){t.autoPlace&&e===t.__save_row||(n+=B.getHeight(e))})),window.innerHeight-e-20GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n'),this.parent)throw new Error("You can only call remember on a top level GUI.");var t=this;p.each(Array.prototype.slice.call(arguments),(function(e){0===t.__rememberedObjects.length&&function(t){var e=t.__save_row=document.createElement("li");B.addClass(t.domElement,"has-save"),t.__ul.insertBefore(e,t.__ul.firstChild),B.addClass(e,"save-row");var n=document.createElement("span");n.innerHTML=" ",B.addClass(n,"button gears");var i=document.createElement("span");i.innerHTML="Save",B.addClass(i,"button"),B.addClass(i,"save");var o=document.createElement("span");o.innerHTML="New",B.addClass(o,"button"),B.addClass(o,"save-as");var r=document.createElement("span");r.innerHTML="Revert",B.addClass(r,"button"),B.addClass(r,"revert");var s=t.__preset_select=document.createElement("select");if(t.load&&t.load.remembered?p.each(t.load.remembered,(function(e,n){ut(t,n,n===t.preset)})):ut(t,J,!1),B.bind(s,"change",(function(){for(var e=0;e0&&(t.preset=this.preset,t.remembered||(t.remembered={}),t.remembered[this.preset]=pt(this)),t.folders={},p.each(this.__folders,(function(e,n){t.folders[n]=e.getSaveObject()})),t},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=pt(this),st(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(t){this.load.remembered||(this.load.remembered={},this.load.remembered[J]=pt(this,!0)),this.load.remembered[t]=pt(this),this.preset=t,ut(this,t,!0),this.saveToLocalStorageIfPossible()},revert:function(t){p.each(this.__controllers,(function(e){this.getRoot().load.remembered?at(t||this.getRoot(),e):e.setValue(e.initialValue),e.__onFinishChange&&e.__onFinishChange.call(e,e.getValue())}),this),p.each(this.__folders,(function(t){t.revert(t)})),t||st(this.getRoot(),!1)},listen:function(t){var e=0===this.__listening.length;this.__listening.push(t),e&&mt(this.__listening)},updateDisplay:function(){p.each(this.__controllers,(function(t){t.updateDisplay()})),p.each(this.__folders,(function(t){t.updateDisplay()}))}});var _t,vt=it;function gt(t){_t=t}const bt=class{constructor(){this.count=0,this.idxBound=!1,this.posBound=!1,this.norBound=!1}destory(){_t.deleteBuffer(this.bufIdx),_t.deleteBuffer(this.bufPos),_t.deleteBuffer(this.bufNor)}generateIdx(){this.idxBound=!0,this.bufIdx=_t.createBuffer()}generatePos(){this.posBound=!0,this.bufPos=_t.createBuffer()}generateNor(){this.norBound=!0,this.bufNor=_t.createBuffer()}bindIdx(){return this.idxBound&&_t.bindBuffer(_t.ELEMENT_ARRAY_BUFFER,this.bufIdx),this.idxBound}bindPos(){return this.posBound&&_t.bindBuffer(_t.ARRAY_BUFFER,this.bufPos),this.posBound}bindNor(){return this.norBound&&_t.bindBuffer(_t.ARRAY_BUFFER,this.bufNor),this.norBound}elemCount(){return this.count}drawMode(){return _t.TRIANGLES}},yt=class extends bt{constructor(t,e,n){super(),this.radius=e,this.subdivisions=n,this.center=a(t[0],t[1],t[2],1)}create(){const t=.5257311121191336,e=.8506508083520399;let n=20*Math.pow(4,this.subdivisions),i=10*Math.pow(4,this.subdivisions)+2;const o=new ArrayBuffer(3*n*Uint32Array.BYTES_PER_ELEMENT+4*i*Float32Array.BYTES_PER_ELEMENT+4*i*Float32Array.BYTES_PER_ELEMENT),r=new ArrayBuffer(3*n*Uint32Array.BYTES_PER_ELEMENT),s=[o,r];let a=0;const d=3*n*Uint32Array.BYTES_PER_ELEMENT,h=d,f=d+4*i*Float32Array.BYTES_PER_ELEMENT;let p=new Array(20),m=new Array;for(let v=0;v<20;++v)p[v]=new Uint32Array(s[a],0+3*v*Uint32Array.BYTES_PER_ELEMENT,3);let _=new Array(12);for(let g=0;g<12;++g)_[g]=new Float32Array(o,d+4*g*Float32Array.BYTES_PER_ELEMENT,4);_[0].set([-t,0,e,0]),_[1].set([t,0,e,0]),_[2].set([-t,0,-e,0]),_[3].set([t,0,-e,0]),_[4].set([0,e,t,0]),_[5].set([0,e,-t,0]),_[6].set([0,-e,t,0]),_[7].set([0,-e,-t,0]),_[8].set([e,t,0,0]),_[9].set([-e,t,0,0]),_[10].set([e,-t,0,0]),_[11].set([-e,-t,0,0]),p[0].set([0,4,1]),p[1].set([0,9,4]),p[2].set([9,5,4]),p[3].set([4,5,8]),p[4].set([4,8,1]),p[5].set([8,10,1]),p[6].set([8,3,10]),p[7].set([5,3,8]),p[8].set([5,2,3]),p[9].set([2,7,3]),p[10].set([7,10,3]),p[11].set([7,6,10]),p[12].set([7,11,6]),p[13].set([11,0,6]),p[14].set([0,1,6]),p[15].set([6,1,10]),p[16].set([9,0,11]),p[17].set([9,11,2]),p[18].set([9,2,5]),p[19].set([7,2,11]);for(let b=0;b Math.abs(dy)) {\r\n view.rotate(t, 0, 0, -dx * flipX * Math.PI * camera.rotateSpeed / window.innerWidth)\r\n } else {\r\n var kzoom = camera.zoomSpeed * flipY * dy / window.innerHeight * (t - view.lastT()) / 100.0\r\n view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1))\r\n }\r\n }, true)\r\n\r\n return camera\r\n}\r\n","'use strict'\n\nmodule.exports = createViewController\n\nvar createTurntable = require('turntable-camera-controller')\nvar createOrbit = require('orbit-camera-controller')\nvar createMatrix = require('matrix-camera-controller')\n\nfunction ViewController(controllers, mode) {\n this._controllerNames = Object.keys(controllers)\n this._controllerList = this._controllerNames.map(function(n) {\n return controllers[n]\n })\n this._mode = mode\n this._active = controllers[mode]\n if(!this._active) {\n this._mode = 'turntable'\n this._active = controllers.turntable\n }\n this.modes = this._controllerNames\n this.computedMatrix = this._active.computedMatrix\n this.computedEye = this._active.computedEye\n this.computedUp = this._active.computedUp\n this.computedCenter = this._active.computedCenter\n this.computedRadius = this._active.computedRadius\n}\n\nvar proto = ViewController.prototype\n\nproto.flush = function(a0) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].flush(a0)\n }\n}\nproto.idle = function(a0) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].idle(a0)\n }\n}\nproto.lookAt = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].lookAt(a0, a1, a2, a3)\n }\n}\nproto.rotate = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].rotate(a0, a1, a2, a3)\n }\n}\nproto.pan = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].pan(a0, a1, a2, a3)\n }\n}\nproto.translate = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].translate(a0, a1, a2, a3)\n }\n}\nproto.setMatrix = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setMatrix(a0, a1)\n }\n}\nproto.setDistanceLimits = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setDistanceLimits(a0, a1)\n }\n}\nproto.setDistance = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setDistance(a0, a1)\n }\n}\n\nproto.recalcMatrix = function(t) {\n this._active.recalcMatrix(t)\n}\n\nproto.getDistance = function(t) {\n return this._active.getDistance(t)\n}\nproto.getDistanceLimits = function(out) {\n return this._active.getDistanceLimits(out)\n}\n\nproto.lastT = function() {\n return this._active.lastT()\n}\n\nproto.setMode = function(mode) {\n if(mode === this._mode) {\n return\n }\n var idx = this._controllerNames.indexOf(mode)\n if(idx < 0) {\n return\n }\n var prev = this._active\n var next = this._controllerList[idx]\n var lastT = Math.max(prev.lastT(), next.lastT())\n\n prev.recalcMatrix(lastT)\n next.setMatrix(lastT, prev.computedMatrix)\n\n this._active = next\n this._mode = mode\n\n //Update matrix properties\n this.computedMatrix = this._active.computedMatrix\n this.computedEye = this._active.computedEye\n this.computedUp = this._active.computedUp\n this.computedCenter = this._active.computedCenter\n this.computedRadius = this._active.computedRadius\n}\n\nproto.getMode = function() {\n return this._mode\n}\n\nfunction createViewController(options) {\n options = options || {}\n\n var eye = options.eye || [0,0,1]\n var center = options.center || [0,0,0]\n var up = options.up || [0,1,0]\n var limits = options.distanceLimits || [0, Infinity]\n var mode = options.mode || 'turntable'\n\n var turntable = createTurntable()\n var orbit = createOrbit()\n var matrix = createMatrix()\n\n turntable.setDistanceLimits(limits[0], limits[1])\n turntable.lookAt(0, eye, center, up)\n orbit.setDistanceLimits(limits[0], limits[1])\n orbit.lookAt(0, eye, center, up)\n matrix.setDistanceLimits(limits[0], limits[1])\n matrix.lookAt(0, eye, center, up)\n\n return new ViewController({\n turntable: turntable,\n orbit: orbit,\n matrix: matrix\n }, mode)\n}","\"use strict\"\n\n// (a, y, c, l, h) = (array, y[, cmp, lo, hi])\n\nfunction ge(a, y, c, l, h) {\n var i = h + 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p >= 0) { i = m; h = m - 1 } else { l = m + 1 }\n }\n return i;\n};\n\nfunction gt(a, y, c, l, h) {\n var i = h + 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p > 0) { i = m; h = m - 1 } else { l = m + 1 }\n }\n return i;\n};\n\nfunction lt(a, y, c, l, h) {\n var i = l - 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p < 0) { i = m; l = m + 1 } else { h = m - 1 }\n }\n return i;\n};\n\nfunction le(a, y, c, l, h) {\n var i = l - 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p <= 0) { i = m; l = m + 1 } else { h = m - 1 }\n }\n return i;\n};\n\nfunction eq(a, y, c, l, h) {\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p === 0) { return m }\n if (p <= 0) { l = m + 1 } else { h = m - 1 }\n }\n return -1;\n};\n\nfunction norm(a, y, c, l, h, f) {\n if (typeof c === 'function') {\n return f(a, y, c, (l === undefined) ? 0 : l | 0, (h === undefined) ? a.length - 1 : h | 0);\n }\n return f(a, y, undefined, (c === undefined) ? 0 : c | 0, (l === undefined) ? a.length - 1 : l | 0);\n}\n\nmodule.exports = {\n ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge)},\n gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt)},\n lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt)},\n le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le)},\n eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq)}\n}\n","\"use strict\"\n\nfunction dcubicHermite(p0, v0, p1, v1, t, f) {\n var dh00 = 6*t*t-6*t,\n dh10 = 3*t*t-4*t + 1,\n dh01 = -6*t*t+6*t,\n dh11 = 3*t*t-2*t\n if(p0.length) {\n if(!f) {\n f = new Array(p0.length)\n }\n for(var i=p0.length-1; i>=0; --i) {\n f[i] = dh00*p0[i] + dh10*v0[i] + dh01*p1[i] + dh11*v1[i]\n }\n return f\n }\n return dh00*p0 + dh10*v0 + dh01*p1[i] + dh11*v1\n}\n\nfunction cubicHermite(p0, v0, p1, v1, t, f) {\n var ti = (t-1), t2 = t*t, ti2 = ti*ti,\n h00 = (1+2*t)*ti2,\n h10 = t*ti2,\n h01 = t2*(3-2*t),\n h11 = t2*ti\n if(p0.length) {\n if(!f) {\n f = new Array(p0.length)\n }\n for(var i=p0.length-1; i>=0; --i) {\n f[i] = h00*p0[i] + h10*v0[i] + h01*p1[i] + h11*v1[i]\n }\n return f\n }\n return h00*p0 + h10*v0 + h01*p1 + h11*v1\n}\n\nmodule.exports = cubicHermite\nmodule.exports.derivative = dcubicHermite","'use strict'\n\nmodule.exports = createFilteredVector\n\nvar cubicHermite = require('cubic-hermite')\nvar bsearch = require('binary-search-bounds')\n\nfunction clamp(lo, hi, x) {\n return Math.min(hi, Math.max(lo, x))\n}\n\nfunction FilteredVector(state0, velocity0, t0) {\n this.dimension = state0.length\n this.bounds = [ new Array(this.dimension), new Array(this.dimension) ]\n for(var i=0; i= n-1) {\n var ptr = state.length-1\n var tf = t - time[n-1]\n for(var i=0; i= n-1) {\n var ptr = state.length-1\n var tf = t - time[n-1]\n for(var i=0; i=0; --i) {\n if(velocity[--ptr]) {\n return false\n }\n }\n return true\n}\n\nproto.jump = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t < t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var ptr = state.length-this.dimension\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n this._time.push(t0, t)\n for(var j=0; j<2; ++j) {\n for(var i=0; i0; --i) {\n state.push(clamp(lo[i-1], hi[i-1], arguments[i]))\n velocity.push(0)\n }\n}\n\nproto.push = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t < t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var ptr = state.length-this.dimension\n var dt = t - t0\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var sf = (dt > 1e-6) ? 1/dt : 0\n this._time.push(t)\n for(var i=d; i>0; --i) {\n var xc = clamp(lo[i-1], hi[i-1], arguments[i])\n state.push(xc)\n velocity.push((xc - state[ptr++]) * sf)\n }\n}\n\nproto.set = function(t) {\n var d = this.dimension\n if(t < this.lastT() || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n this._time.push(t)\n for(var i=d; i>0; --i) {\n state.push(clamp(lo[i-1], hi[i-1], arguments[i]))\n velocity.push(0)\n }\n}\n\nproto.move = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t <= t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var statePtr = state.length - this.dimension\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var dt = t - t0\n var sf = (dt > 1e-6) ? 1/dt : 0.0\n this._time.push(t)\n for(var i=d; i>0; --i) {\n var dx = arguments[i]\n state.push(clamp(lo[i-1], hi[i-1], state[statePtr++] + dx))\n velocity.push(dx * sf)\n }\n}\n\nproto.idle = function(t) {\n var t0 = this.lastT()\n if(t < t0) {\n return\n }\n var d = this.dimension\n var state = this._state\n var velocity = this._velocity\n var statePtr = state.length-d\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var dt = t - t0\n this._time.push(t)\n for(var i=d-1; i>=0; --i) {\n state.push(clamp(lo[i], hi[i], state[statePtr] + dt * velocity[statePtr]))\n velocity.push(0)\n statePtr += 1\n }\n}\n\nfunction getZero(d) {\n var result = new Array(d)\n for(var i=0; i 0.000001) {\n // standard case (slerp)\n omega = Math.acos(cosom)\n sinom = Math.sin(omega)\n scale0 = Math.sin((1.0 - t) * omega) / sinom\n scale1 = Math.sin(t * omega) / sinom\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t\n scale1 = t\n }\n // calculate final values\n out[0] = scale0 * ax + scale1 * bx\n out[1] = scale0 * ay + scale1 * by\n out[2] = scale0 * az + scale1 * bz\n out[3] = scale0 * aw + scale1 * bw\n\n return out\n}\n","module.exports = cross;\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nfunction cross(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2],\n bx = b[0], by = b[1], bz = b[2]\n\n out[0] = ay * bz - az * by\n out[1] = az * bx - ax * bz\n out[2] = ax * by - ay * bx\n return out\n}","module.exports = dot;\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}","module.exports = length;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nfunction length(a) {\n var x = a[0],\n y = a[1],\n z = a[2]\n return Math.sqrt(x*x + y*y + z*z)\n}","module.exports = lerp;\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nfunction lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2]\n out[0] = ax + t * (b[0] - ax)\n out[1] = ay + t * (b[1] - ay)\n out[2] = az + t * (b[2] - az)\n return out\n}","module.exports = normalize;\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nfunction normalize(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2]\n var len = x*x + y*y + z*z\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len)\n out[0] = a[0] * len\n out[1] = a[1] * len\n out[2] = a[2] * len\n }\n return out\n}","'use strict'\r\n\r\nvar isBrowser = require('is-browser')\r\n\r\nfunction detect() {\r\n\tvar supported = false\r\n\r\n\ttry {\r\n\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\tget: function() {\r\n\t\t\t\tsupported = true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\twindow.addEventListener('test', null, opts)\r\n\t\twindow.removeEventListener('test', null, opts)\r\n\t} catch(e) {\r\n\t\tsupported = false\r\n\t}\r\n\r\n\treturn supported\r\n}\r\n\r\nmodule.exports = isBrowser && detect()\r\n","module.exports = true;","/*jshint unused:true*/\n/*\nInput: matrix ; a 4x4 matrix\nOutput: translation ; a 3 component vector\n scale ; a 3 component vector\n skew ; skew factors XY,XZ,YZ represented as a 3 component vector\n perspective ; a 4 component vector\n quaternion ; a 4 component vector\nReturns false if the matrix cannot be decomposed, true if it can\n\n\nReferences:\nhttps://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js\nhttps://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc\nhttp://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix\n*/\n\nvar normalize = require('./normalize')\n\nvar create = require('gl-mat4/create')\nvar clone = require('gl-mat4/clone')\nvar determinant = require('gl-mat4/determinant')\nvar invert = require('gl-mat4/invert')\nvar transpose = require('gl-mat4/transpose')\nvar vec3 = {\n length: require('gl-vec3/length'),\n normalize: require('gl-vec3/normalize'),\n dot: require('gl-vec3/dot'),\n cross: require('gl-vec3/cross')\n}\n\nvar tmp = create()\nvar perspectiveMatrix = create()\nvar tmpVec4 = [0, 0, 0, 0]\nvar row = [ [0,0,0], [0,0,0], [0,0,0] ]\nvar pdum3 = [0,0,0]\n\nmodule.exports = function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) {\n if (!translation) translation = [0,0,0]\n if (!scale) scale = [0,0,0]\n if (!skew) skew = [0,0,0]\n if (!perspective) perspective = [0,0,0,1]\n if (!quaternion) quaternion = [0,0,0,1]\n\n //normalize, if not possible then bail out early\n if (!normalize(tmp, matrix))\n return false\n\n // perspectiveMatrix is used to solve for perspective, but it also provides\n // an easy way to test for singularity of the upper 3x3 component.\n clone(perspectiveMatrix, tmp)\n\n perspectiveMatrix[3] = 0\n perspectiveMatrix[7] = 0\n perspectiveMatrix[11] = 0\n perspectiveMatrix[15] = 1\n\n // If the perspectiveMatrix is not invertible, we are also unable to\n // decompose, so we'll bail early. Constant taken from SkMatrix44::invert.\n if (Math.abs(determinant(perspectiveMatrix) < 1e-8))\n return false\n\n var a03 = tmp[3], a13 = tmp[7], a23 = tmp[11],\n a30 = tmp[12], a31 = tmp[13], a32 = tmp[14], a33 = tmp[15]\n\n // First, isolate perspective.\n if (a03 !== 0 || a13 !== 0 || a23 !== 0) {\n tmpVec4[0] = a03\n tmpVec4[1] = a13\n tmpVec4[2] = a23\n tmpVec4[3] = a33\n\n // Solve the equation by inverting perspectiveMatrix and multiplying\n // rightHandSide by the inverse.\n // resuing the perspectiveMatrix here since it's no longer needed\n var ret = invert(perspectiveMatrix, perspectiveMatrix)\n if (!ret) return false\n transpose(perspectiveMatrix, perspectiveMatrix)\n\n //multiply by transposed inverse perspective matrix, into perspective vec4\n vec4multMat4(perspective, tmpVec4, perspectiveMatrix)\n } else { \n //no perspective\n perspective[0] = perspective[1] = perspective[2] = 0\n perspective[3] = 1\n }\n\n // Next take care of translation\n translation[0] = a30\n translation[1] = a31\n translation[2] = a32\n\n // Now get scale and shear. 'row' is a 3 element array of 3 component vectors\n mat3from4(row, tmp)\n\n // Compute X scale factor and normalize first row.\n scale[0] = vec3.length(row[0])\n vec3.normalize(row[0], row[0])\n\n // Compute XY shear factor and make 2nd row orthogonal to 1st.\n skew[0] = vec3.dot(row[0], row[1])\n combine(row[1], row[1], row[0], 1.0, -skew[0])\n\n // Now, compute Y scale and normalize 2nd row.\n scale[1] = vec3.length(row[1])\n vec3.normalize(row[1], row[1])\n skew[0] /= scale[1]\n\n // Compute XZ and YZ shears, orthogonalize 3rd row\n skew[1] = vec3.dot(row[0], row[2])\n combine(row[2], row[2], row[0], 1.0, -skew[1])\n skew[2] = vec3.dot(row[1], row[2])\n combine(row[2], row[2], row[1], 1.0, -skew[2])\n\n // Next, get Z scale and normalize 3rd row.\n scale[2] = vec3.length(row[2])\n vec3.normalize(row[2], row[2])\n skew[1] /= scale[2]\n skew[2] /= scale[2]\n\n\n // At this point, the matrix (in rows) is orthonormal.\n // Check for a coordinate system flip. If the determinant\n // is -1, then negate the matrix and the scaling factors.\n vec3.cross(pdum3, row[1], row[2])\n if (vec3.dot(row[0], pdum3) < 0) {\n for (var i = 0; i < 3; i++) {\n scale[i] *= -1;\n row[i][0] *= -1\n row[i][1] *= -1\n row[i][2] *= -1\n }\n }\n\n // Now, get the rotations out\n quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0))\n quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0))\n quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0))\n quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0))\n\n if (row[2][1] > row[1][2])\n quaternion[0] = -quaternion[0]\n if (row[0][2] > row[2][0])\n quaternion[1] = -quaternion[1]\n if (row[1][0] > row[0][1])\n quaternion[2] = -quaternion[2]\n return true\n}\n\n//will be replaced by gl-vec4 eventually\nfunction vec4multMat4(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n\n//gets upper-left of a 4x4 matrix into a 3x3 of vectors\nfunction mat3from4(out, mat4x4) {\n out[0][0] = mat4x4[0]\n out[0][1] = mat4x4[1]\n out[0][2] = mat4x4[2]\n \n out[1][0] = mat4x4[4]\n out[1][1] = mat4x4[5]\n out[1][2] = mat4x4[6]\n\n out[2][0] = mat4x4[8]\n out[2][1] = mat4x4[9]\n out[2][2] = mat4x4[10]\n}\n\nfunction combine(out, a, b, scale1, scale2) {\n out[0] = a[0] * scale1 + b[0] * scale2\n out[1] = a[1] * scale1 + b[1] * scale2\n out[2] = a[2] * scale1 + b[2] * scale2\n}","module.exports = function normalize(out, mat) {\n var m44 = mat[15]\n // Cannot normalize.\n if (m44 === 0) \n return false\n var scale = 1 / m44\n for (var i=0; i<16; i++)\n out[i] = mat[i] * scale\n return true\n}","var lerp = require('gl-vec3/lerp')\n\nvar recompose = require('mat4-recompose')\nvar decompose = require('mat4-decompose')\nvar determinant = require('gl-mat4/determinant')\nvar slerp = require('quat-slerp')\n\nvar state0 = state()\nvar state1 = state()\nvar tmp = state()\n\nmodule.exports = interpolate\nfunction interpolate(out, start, end, alpha) {\n if (determinant(start) === 0 || determinant(end) === 0)\n return false\n\n //decompose the start and end matrices into individual components\n var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion)\n var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion)\n if (!r0 || !r1)\n return false \n\n\n //now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha)\n lerp(tmp.translate, state0.translate, state1.translate, alpha)\n lerp(tmp.skew, state0.skew, state1.skew, alpha)\n lerp(tmp.scale, state0.scale, state1.scale, alpha)\n lerp(tmp.perspective, state0.perspective, state1.perspective, alpha)\n slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha)\n\n //and recompose into our 'out' matrix\n recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion)\n return true\n}\n\nfunction state() {\n return {\n translate: vec3(),\n scale: vec3(1),\n skew: vec3(),\n perspective: vec4(),\n quaternion: vec4()\n }\n}\n\nfunction vec3(n) {\n return [n||0,n||0,n||0]\n}\n\nfunction vec4() {\n return [0,0,0,1]\n}","/*\nInput: translation ; a 3 component vector\n scale ; a 3 component vector\n skew ; skew factors XY,XZ,YZ represented as a 3 component vector\n perspective ; a 4 component vector\n quaternion ; a 4 component vector\nOutput: matrix ; a 4x4 matrix\n\nFrom: http://www.w3.org/TR/css3-transforms/#recomposing-to-a-3d-matrix\n*/\n\nvar mat4 = {\n identity: require('gl-mat4/identity'),\n translate: require('gl-mat4/translate'),\n multiply: require('gl-mat4/multiply'),\n create: require('gl-mat4/create'),\n scale: require('gl-mat4/scale'),\n fromRotationTranslation: require('gl-mat4/fromRotationTranslation')\n}\n\nvar rotationMatrix = mat4.create()\nvar temp = mat4.create()\n\nmodule.exports = function recomposeMat4(matrix, translation, scale, skew, perspective, quaternion) {\n mat4.identity(matrix)\n\n //apply translation & rotation\n mat4.fromRotationTranslation(matrix, quaternion, translation)\n\n //apply perspective\n matrix[3] = perspective[0]\n matrix[7] = perspective[1]\n matrix[11] = perspective[2]\n matrix[15] = perspective[3]\n \n // apply skew\n // temp is a identity 4x4 matrix initially\n mat4.identity(temp)\n\n if (skew[2] !== 0) {\n temp[9] = skew[2]\n mat4.multiply(matrix, matrix, temp)\n }\n\n if (skew[1] !== 0) {\n temp[9] = 0\n temp[8] = skew[1]\n mat4.multiply(matrix, matrix, temp)\n }\n\n if (skew[0] !== 0) {\n temp[8] = 0\n temp[4] = skew[0]\n mat4.multiply(matrix, matrix, temp)\n }\n\n //apply scale\n mat4.scale(matrix, matrix, scale)\n return matrix\n}","'use strict'\n\nvar bsearch = require('binary-search-bounds')\nvar m4interp = require('mat4-interpolate')\nvar invert44 = require('gl-mat4/invert')\nvar rotateX = require('gl-mat4/rotateX')\nvar rotateY = require('gl-mat4/rotateY')\nvar rotateZ = require('gl-mat4/rotateZ')\nvar lookAt = require('gl-mat4/lookAt')\nvar translate = require('gl-mat4/translate')\nvar scale = require('gl-mat4/scale')\nvar normalize = require('gl-vec3/normalize')\n\nvar DEFAULT_CENTER = [0,0,0]\n\nmodule.exports = createMatrixCameraController\n\nfunction MatrixCameraController(initialMatrix) {\n this._components = initialMatrix.slice()\n this._time = [0]\n this.prevMatrix = initialMatrix.slice()\n this.nextMatrix = initialMatrix.slice()\n this.computedMatrix = initialMatrix.slice()\n this.computedInverse = initialMatrix.slice()\n this.computedEye = [0,0,0]\n this.computedUp = [0,0,0]\n this.computedCenter = [0,0,0]\n this.computedRadius = [0]\n this._limits = [-Infinity, Infinity]\n}\n\nvar proto = MatrixCameraController.prototype\n\nproto.recalcMatrix = function(t) {\n var time = this._time\n var tidx = bsearch.le(time, t)\n var mat = this.computedMatrix\n if(tidx < 0) {\n return\n }\n var comps = this._components\n if(tidx === time.length-1) {\n var ptr = 16*tidx\n for(var i=0; i<16; ++i) {\n mat[i] = comps[ptr++]\n }\n } else {\n var dt = (time[tidx+1] - time[tidx])\n var ptr = 16*tidx\n var prev = this.prevMatrix\n var allEqual = true\n for(var i=0; i<16; ++i) {\n prev[i] = comps[ptr++]\n }\n var next = this.nextMatrix\n for(var i=0; i<16; ++i) {\n next[i] = comps[ptr++]\n allEqual = allEqual && (prev[i] === next[i])\n }\n if(dt < 1e-6 || allEqual) {\n for(var i=0; i<16; ++i) {\n mat[i] = prev[i]\n }\n } else {\n m4interp(mat, prev, next, (t - time[tidx])/dt)\n }\n }\n\n var up = this.computedUp\n up[0] = mat[1]\n up[1] = mat[5]\n up[2] = mat[9]\n normalize(up, up)\n\n var imat = this.computedInverse\n invert44(imat, mat)\n var eye = this.computedEye\n var w = imat[15]\n eye[0] = imat[12]/w\n eye[1] = imat[13]/w\n eye[2] = imat[14]/w\n\n var center = this.computedCenter\n var radius = Math.exp(this.computedRadius[0])\n for(var i=0; i<3; ++i) {\n center[i] = eye[i] - mat[2+4*i] * radius\n }\n}\n\nproto.idle = function(t) {\n if(t < this.lastT()) {\n return\n }\n var mc = this._components\n var ptr = mc.length-16\n for(var i=0; i<16; ++i) {\n mc.push(mc[ptr++])\n }\n this._time.push(t)\n}\n\nproto.flush = function(t) {\n var idx = bsearch.gt(this._time, t) - 2\n if(idx < 0) {\n return\n }\n this._time.splice(0, idx)\n this._components.splice(0, 16*idx)\n}\n\nproto.lastT = function() {\n return this._time[this._time.length-1]\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n eye = eye || this.computedEye\n center = center || DEFAULT_CENTER\n up = up || this.computedUp\n this.setMatrix(t, lookAt(this.computedMatrix, eye, center, up))\n var d2 = 0.0\n for(var i=0; i<3; ++i) {\n d2 += Math.pow(center[i] - eye[i], 2)\n }\n d2 = Math.log(Math.sqrt(d2))\n this.computedRadius[0] = d2\n}\n\nproto.rotate = function(t, yaw, pitch, roll) {\n this.recalcMatrix(t)\n var mat = this.computedInverse\n if(yaw) rotateY(mat, mat, yaw)\n if(pitch) rotateX(mat, mat, pitch)\n if(roll) rotateZ(mat, mat, roll)\n this.setMatrix(t, invert44(this.computedMatrix, mat))\n}\n\nvar tvec = [0,0,0]\n\nproto.pan = function(t, dx, dy, dz) {\n tvec[0] = -(dx || 0.0)\n tvec[1] = -(dy || 0.0)\n tvec[2] = -(dz || 0.0)\n this.recalcMatrix(t)\n var mat = this.computedInverse\n translate(mat, mat, tvec)\n this.setMatrix(t, invert44(mat, mat))\n}\n\nproto.translate = function(t, dx, dy, dz) {\n tvec[0] = dx || 0.0\n tvec[1] = dy || 0.0\n tvec[2] = dz || 0.0\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n translate(mat, mat, tvec)\n this.setMatrix(t, mat)\n}\n\nproto.setMatrix = function(t, mat) {\n if(t < this.lastT()) {\n return\n }\n this._time.push(t)\n for(var i=0; i<16; ++i) {\n this._components.push(mat[i])\n }\n}\n\nproto.setDistance = function(t, d) {\n this.computedRadius[0] = d\n}\n\nproto.setDistanceLimits = function(a,b) {\n var lim = this._limits\n lim[0] = a\n lim[1] = b\n}\n\nproto.getDistanceLimits = function(out) {\n var lim = this._limits\n if(out) {\n out[0] = lim[0]\n out[1] = lim[1]\n return out\n }\n return lim\n}\n\nfunction createMatrixCameraController(options) {\n options = options || {}\n var matrix = options.matrix || \n [1,0,0,0,\n 0,1,0,0,\n 0,0,1,0,\n 0,0,0,1]\n return new MatrixCameraController(matrix)\n}\n","'use strict'\n\nmodule.exports = mouseListen\n\nvar mouse = require('mouse-event')\n\nfunction mouseListen (element, callback) {\n if (!callback) {\n callback = element\n element = window\n }\n\n var buttonState = 0\n var x = 0\n var y = 0\n var mods = {\n shift: false,\n alt: false,\n control: false,\n meta: false\n }\n var attached = false\n\n function updateMods (ev) {\n var changed = false\n if ('altKey' in ev) {\n changed = changed || ev.altKey !== mods.alt\n mods.alt = !!ev.altKey\n }\n if ('shiftKey' in ev) {\n changed = changed || ev.shiftKey !== mods.shift\n mods.shift = !!ev.shiftKey\n }\n if ('ctrlKey' in ev) {\n changed = changed || ev.ctrlKey !== mods.control\n mods.control = !!ev.ctrlKey\n }\n if ('metaKey' in ev) {\n changed = changed || ev.metaKey !== mods.meta\n mods.meta = !!ev.metaKey\n }\n return changed\n }\n\n function handleEvent (nextButtons, ev) {\n var nextX = mouse.x(ev)\n var nextY = mouse.y(ev)\n if ('buttons' in ev) {\n nextButtons = ev.buttons | 0\n }\n if (nextButtons !== buttonState ||\n nextX !== x ||\n nextY !== y ||\n updateMods(ev)) {\n buttonState = nextButtons | 0\n x = nextX || 0\n y = nextY || 0\n callback && callback(buttonState, x, y, mods)\n }\n }\n\n function clearState (ev) {\n handleEvent(0, ev)\n }\n\n function handleBlur () {\n if (buttonState ||\n x ||\n y ||\n mods.shift ||\n mods.alt ||\n mods.meta ||\n mods.control) {\n x = y = 0\n buttonState = 0\n mods.shift = mods.alt = mods.control = mods.meta = false\n callback && callback(0, 0, 0, mods)\n }\n }\n\n function handleMods (ev) {\n if (updateMods(ev)) {\n callback && callback(buttonState, x, y, mods)\n }\n }\n\n function handleMouseMove (ev) {\n if (mouse.buttons(ev) === 0) {\n handleEvent(0, ev)\n } else {\n handleEvent(buttonState, ev)\n }\n }\n\n function handleMouseDown (ev) {\n handleEvent(buttonState | mouse.buttons(ev), ev)\n }\n\n function handleMouseUp (ev) {\n handleEvent(buttonState & ~mouse.buttons(ev), ev)\n }\n\n function attachListeners () {\n if (attached) {\n return\n }\n attached = true\n\n element.addEventListener('mousemove', handleMouseMove)\n\n element.addEventListener('mousedown', handleMouseDown)\n\n element.addEventListener('mouseup', handleMouseUp)\n\n element.addEventListener('mouseleave', clearState)\n element.addEventListener('mouseenter', clearState)\n element.addEventListener('mouseout', clearState)\n element.addEventListener('mouseover', clearState)\n\n element.addEventListener('blur', handleBlur)\n\n element.addEventListener('keyup', handleMods)\n element.addEventListener('keydown', handleMods)\n element.addEventListener('keypress', handleMods)\n\n if (element !== window) {\n window.addEventListener('blur', handleBlur)\n\n window.addEventListener('keyup', handleMods)\n window.addEventListener('keydown', handleMods)\n window.addEventListener('keypress', handleMods)\n }\n }\n\n function detachListeners () {\n if (!attached) {\n return\n }\n attached = false\n\n element.removeEventListener('mousemove', handleMouseMove)\n\n element.removeEventListener('mousedown', handleMouseDown)\n\n element.removeEventListener('mouseup', handleMouseUp)\n\n element.removeEventListener('mouseleave', clearState)\n element.removeEventListener('mouseenter', clearState)\n element.removeEventListener('mouseout', clearState)\n element.removeEventListener('mouseover', clearState)\n\n element.removeEventListener('blur', handleBlur)\n\n element.removeEventListener('keyup', handleMods)\n element.removeEventListener('keydown', handleMods)\n element.removeEventListener('keypress', handleMods)\n\n if (element !== window) {\n window.removeEventListener('blur', handleBlur)\n\n window.removeEventListener('keyup', handleMods)\n window.removeEventListener('keydown', handleMods)\n window.removeEventListener('keypress', handleMods)\n }\n }\n\n // Attach listeners\n attachListeners()\n\n var result = {\n element: element\n }\n\n Object.defineProperties(result, {\n enabled: {\n get: function () { return attached },\n set: function (f) {\n if (f) {\n attachListeners()\n } else {\n detachListeners()\n }\n },\n enumerable: true\n },\n buttons: {\n get: function () { return buttonState },\n enumerable: true\n },\n x: {\n get: function () { return x },\n enumerable: true\n },\n y: {\n get: function () { return y },\n enumerable: true\n },\n mods: {\n get: function () { return mods },\n enumerable: true\n }\n })\n\n return result\n}\n","var rootPosition = { left: 0, top: 0 }\n\nmodule.exports = mouseEventOffset\nfunction mouseEventOffset (ev, target, out) {\n target = target || ev.currentTarget || ev.srcElement\n if (!Array.isArray(out)) {\n out = [ 0, 0 ]\n }\n var cx = ev.clientX || 0\n var cy = ev.clientY || 0\n var rect = getBoundingClientOffset(target)\n out[0] = cx - rect.left\n out[1] = cy - rect.top\n return out\n}\n\nfunction getBoundingClientOffset (element) {\n if (element === window ||\n element === document ||\n element === document.body) {\n return rootPosition\n } else {\n return element.getBoundingClientRect()\n }\n}\n","'use strict'\n\nfunction mouseButtons(ev) {\n if(typeof ev === 'object') {\n if('buttons' in ev) {\n return ev.buttons\n } else if('which' in ev) {\n var b = ev.which\n if(b === 2) {\n return 4\n } else if(b === 3) {\n return 2\n } else if(b > 0) {\n return 1<<(b-1)\n }\n } else if('button' in ev) {\n var b = ev.button\n if(b === 1) {\n return 4\n } else if(b === 2) {\n return 2\n } else if(b >= 0) {\n return 1< 0) {\n var l = Math.sqrt(tr + 1.0)\n out[0] = 0.5 * (uz - fy) / l\n out[1] = 0.5 * (fx - rz) / l\n out[2] = 0.5 * (ry - uy) / l\n out[3] = 0.5 * l\n } else {\n var tf = Math.max(rx, uy, fz)\n var l = Math.sqrt(2 * tf - tr + 1.0)\n if(rx >= tf) {\n //x y z order\n out[0] = 0.5 * l\n out[1] = 0.5 * (ux + ry) / l\n out[2] = 0.5 * (fx + rz) / l\n out[3] = 0.5 * (uz - fy) / l\n } else if(uy >= tf) {\n //y z x order\n out[0] = 0.5 * (ry + ux) / l\n out[1] = 0.5 * l\n out[2] = 0.5 * (fy + uz) / l\n out[3] = 0.5 * (fx - rz) / l\n } else {\n //z x y order\n out[0] = 0.5 * (rz + fx) / l\n out[1] = 0.5 * (uz + fy) / l\n out[2] = 0.5 * l\n out[3] = 0.5 * (ry - ux) / l\n }\n }\n return out\n}","'use strict'\n\nmodule.exports = createOrbitController\n\nvar filterVector = require('filtered-vector')\nvar lookAt = require('gl-mat4/lookAt')\nvar mat4FromQuat = require('gl-mat4/fromQuat')\nvar invert44 = require('gl-mat4/invert')\nvar quatFromFrame = require('./lib/quatFromFrame')\n\nfunction len3(x,y,z) {\n return Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))\n}\n\nfunction len4(w,x,y,z) {\n return Math.sqrt(Math.pow(w,2) + Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))\n}\n\nfunction normalize4(out, a) {\n var ax = a[0]\n var ay = a[1]\n var az = a[2]\n var aw = a[3]\n var al = len4(ax, ay, az, aw)\n if(al > 1e-6) {\n out[0] = ax/al\n out[1] = ay/al\n out[2] = az/al\n out[3] = aw/al\n } else {\n out[0] = out[1] = out[2] = 0.0\n out[3] = 1.0\n }\n}\n\nfunction OrbitCameraController(initQuat, initCenter, initRadius) {\n this.radius = filterVector([initRadius])\n this.center = filterVector(initCenter)\n this.rotation = filterVector(initQuat)\n\n this.computedRadius = this.radius.curve(0)\n this.computedCenter = this.center.curve(0)\n this.computedRotation = this.rotation.curve(0)\n this.computedUp = [0.1,0,0]\n this.computedEye = [0.1,0,0]\n this.computedMatrix = [0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\n\n this.recalcMatrix(0)\n}\n\nvar proto = OrbitCameraController.prototype\n\nproto.lastT = function() {\n return Math.max(\n this.radius.lastT(),\n this.center.lastT(),\n this.rotation.lastT())\n}\n\nproto.recalcMatrix = function(t) {\n this.radius.curve(t)\n this.center.curve(t)\n this.rotation.curve(t)\n\n var quat = this.computedRotation\n normalize4(quat, quat)\n\n var mat = this.computedMatrix\n mat4FromQuat(mat, quat)\n\n var center = this.computedCenter\n var eye = this.computedEye\n var up = this.computedUp\n var radius = Math.exp(this.computedRadius[0])\n\n eye[0] = center[0] + radius * mat[2]\n eye[1] = center[1] + radius * mat[6]\n eye[2] = center[2] + radius * mat[10]\n up[0] = mat[1]\n up[1] = mat[5]\n up[2] = mat[9]\n\n for(var i=0; i<3; ++i) {\n var rr = 0.0\n for(var j=0; j<3; ++j) {\n rr += mat[i+4*j] * eye[j]\n }\n mat[12+i] = -rr\n }\n}\n\nproto.getMatrix = function(t, result) {\n this.recalcMatrix(t)\n var m = this.computedMatrix\n if(result) {\n for(var i=0; i<16; ++i) {\n result[i] = m[i]\n }\n return result\n }\n return m\n}\n\nproto.idle = function(t) {\n this.center.idle(t)\n this.radius.idle(t)\n this.rotation.idle(t)\n}\n\nproto.flush = function(t) {\n this.center.flush(t)\n this.radius.flush(t)\n this.rotation.flush(t)\n}\n\nproto.pan = function(t, dx, dy, dz) {\n dx = dx || 0.0\n dy = dy || 0.0\n dz = dz || 0.0\n\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n\n var fx = mat[2]\n var fy = mat[6]\n var fz = mat[10]\n var fu = fx * ux + fy * uy + fz * uz\n var fr = fx * rx + fy * ry + fz * rz\n fx -= fu * ux + fr * rx\n fy -= fu * uy + fr * ry\n fz -= fu * uz + fr * rz\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n var vx = rx * dx + ux * dy\n var vy = ry * dx + uy * dy\n var vz = rz * dx + uz * dy\n\n this.center.move(t, vx, vy, vz)\n\n //Update z-component of radius\n var radius = Math.exp(this.computedRadius[0])\n radius = Math.max(1e-4, radius + dz)\n this.radius.set(t, Math.log(radius))\n}\n\nproto.rotate = function(t, dx, dy, dz) {\n this.recalcMatrix(t)\n\n dx = dx||0.0\n dy = dy||0.0\n\n var mat = this.computedMatrix\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n\n var fx = mat[2]\n var fy = mat[6]\n var fz = mat[10]\n\n var qx = dx * rx + dy * ux\n var qy = dx * ry + dy * uy\n var qz = dx * rz + dy * uz\n\n var bx = -(fy * qz - fz * qy)\n var by = -(fz * qx - fx * qz)\n var bz = -(fx * qy - fy * qx) \n var bw = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(bx,2) - Math.pow(by,2) - Math.pow(bz,2)))\n var bl = len4(bx, by, bz, bw)\n if(bl > 1e-6) {\n bx /= bl\n by /= bl\n bz /= bl\n bw /= bl\n } else {\n bx = by = bz = 0.0\n bw = 1.0\n }\n\n var rotation = this.computedRotation\n var ax = rotation[0]\n var ay = rotation[1]\n var az = rotation[2]\n var aw = rotation[3]\n\n var cx = ax*bw + aw*bx + ay*bz - az*by\n var cy = ay*bw + aw*by + az*bx - ax*bz\n var cz = az*bw + aw*bz + ax*by - ay*bx\n var cw = aw*bw - ax*bx - ay*by - az*bz\n \n //Apply roll\n if(dz) {\n bx = fx\n by = fy\n bz = fz\n var s = Math.sin(dz) / len3(bx, by, bz)\n bx *= s\n by *= s\n bz *= s\n bw = Math.cos(dx)\n cx = cx*bw + cw*bx + cy*bz - cz*by\n cy = cy*bw + cw*by + cz*bx - cx*bz\n cz = cz*bw + cw*bz + cx*by - cy*bx\n cw = cw*bw - cx*bx - cy*by - cz*bz\n }\n\n var cl = len4(cx, cy, cz, cw)\n if(cl > 1e-6) {\n cx /= cl\n cy /= cl\n cz /= cl\n cw /= cl\n } else {\n cx = cy = cz = 0.0\n cw = 1.0\n }\n\n this.rotation.set(t, cx, cy, cz, cw)\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n\n center = center || this.computedCenter\n eye = eye || this.computedEye\n up = up || this.computedUp\n\n var mat = this.computedMatrix\n lookAt(mat, eye, center, up)\n\n var rotation = this.computedRotation\n quatFromFrame(rotation,\n mat[0], mat[1], mat[2],\n mat[4], mat[5], mat[6],\n mat[8], mat[9], mat[10])\n normalize4(rotation, rotation)\n this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3])\n\n var fl = 0.0\n for(var i=0; i<3; ++i) {\n fl += Math.pow(center[i] - eye[i], 2)\n }\n this.radius.set(t, 0.5 * Math.log(Math.max(fl, 1e-6)))\n\n this.center.set(t, center[0], center[1], center[2])\n}\n\nproto.translate = function(t, dx, dy, dz) {\n this.center.move(t,\n dx||0.0,\n dy||0.0,\n dz||0.0)\n}\n\nproto.setMatrix = function(t, matrix) {\n\n var rotation = this.computedRotation\n quatFromFrame(rotation,\n matrix[0], matrix[1], matrix[2],\n matrix[4], matrix[5], matrix[6],\n matrix[8], matrix[9], matrix[10])\n normalize4(rotation, rotation)\n this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3])\n\n var mat = this.computedMatrix\n invert44(mat, matrix)\n var w = mat[15]\n if(Math.abs(w) > 1e-6) {\n var cx = mat[12]/w\n var cy = mat[13]/w\n var cz = mat[14]/w\n\n this.recalcMatrix(t) \n var r = Math.exp(this.computedRadius[0])\n this.center.set(t, cx-mat[2]*r, cy-mat[6]*r, cz-mat[10]*r)\n this.radius.idle(t)\n } else {\n this.center.idle(t)\n this.radius.idle(t)\n }\n}\n\nproto.setDistance = function(t, d) {\n if(d > 0) {\n this.radius.set(t, Math.log(d))\n }\n}\n\nproto.setDistanceLimits = function(lo, hi) {\n if(lo > 0) {\n lo = Math.log(lo)\n } else {\n lo = -Infinity \n }\n if(hi > 0) {\n hi = Math.log(hi)\n } else {\n hi = Infinity\n }\n hi = Math.max(hi, lo)\n this.radius.bounds[0][0] = lo\n this.radius.bounds[1][0] = hi\n}\n\nproto.getDistanceLimits = function(out) {\n var bounds = this.radius.bounds\n if(out) {\n out[0] = Math.exp(bounds[0][0])\n out[1] = Math.exp(bounds[1][0])\n return out\n }\n return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ]\n}\n\nproto.toJSON = function() {\n this.recalcMatrix(this.lastT())\n return {\n center: this.computedCenter.slice(),\n rotation: this.computedRotation.slice(),\n distance: Math.log(this.computedRadius[0]),\n zoomMin: this.radius.bounds[0][0],\n zoomMax: this.radius.bounds[1][0]\n }\n}\n\nproto.fromJSON = function(options) {\n var t = this.lastT()\n var c = options.center\n if(c) {\n this.center.set(t, c[0], c[1], c[2])\n }\n var r = options.rotation\n if(r) {\n this.rotation.set(t, r[0], r[1], r[2], r[3])\n }\n var d = options.distance\n if(d && d > 0) {\n this.radius.set(t, Math.log(d))\n }\n this.setDistanceLimits(options.zoomMin, options.zoomMax)\n}\n\nfunction createOrbitController(options) {\n options = options || {}\n var center = options.center || [0,0,0]\n var rotation = options.rotation || [0,0,0,1]\n var radius = options.radius || 1.0\n\n center = [].slice.call(center, 0, 3)\n rotation = [].slice.call(rotation, 0, 4)\n normalize4(rotation, rotation)\n\n var result = new OrbitCameraController(\n rotation,\n center,\n Math.log(radius))\n\n result.setDistanceLimits(options.zoomMin, options.zoomMax)\n\n if('eye' in options || 'up' in options) {\n result.lookAt(0, options.eye, options.center, options.up)\n }\n\n return result\n}","module.exports = function parseUnit(str, out) {\n if (!out)\n out = [ 0, '' ]\n\n str = String(str)\n var num = parseFloat(str, 10)\n out[0] = num\n out[1] = str.match(/[\\d.\\-\\+]*\\s*(.*)/)[1] || ''\n return out\n}","module.exports = require('gl-quat/slerp')","module.exports =\n global.performance &&\n global.performance.now ? function now() {\n return performance.now()\n } : Date.now || function now() {\n return +new Date\n }\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.Stats=t()}(this,function(){\"use strict\";var c=function(){var n=0,l=document.createElement(\"div\");function e(e){return l.appendChild(e.dom),e}function t(e){for(var t=0;t Math.max(vy, vz)) {\n u[2] = 1\n } else if(vy > Math.max(vx, vz)) {\n u[0] = 1\n } else {\n u[1] = 1\n }\n\n var vv = 0\n var uv = 0\n for(var i=0; i<3; ++i ) {\n vv += v[i] * v[i]\n uv += u[i] * v[i]\n }\n for(var i=0; i<3; ++i) {\n u[i] -= (uv / vv) * v[i]\n }\n normalize3(u, u)\n return u\n}\n\nfunction TurntableController(zoomMin, zoomMax, center, up, right, radius, theta, phi) {\n this.center = filterVector(center)\n this.up = filterVector(up)\n this.right = filterVector(right)\n this.radius = filterVector([radius])\n this.angle = filterVector([theta, phi])\n this.angle.bounds = [[-Infinity,-Math.PI/2], [Infinity,Math.PI/2]]\n this.setDistanceLimits(zoomMin, zoomMax)\n\n this.computedCenter = this.center.curve(0)\n this.computedUp = this.up.curve(0)\n this.computedRight = this.right.curve(0)\n this.computedRadius = this.radius.curve(0)\n this.computedAngle = this.angle.curve(0)\n this.computedToward = [0,0,0]\n this.computedEye = [0,0,0]\n this.computedMatrix = new Array(16)\n for(var i=0; i<16; ++i) {\n this.computedMatrix[i] = 0.5\n }\n\n this.recalcMatrix(0)\n}\n\nvar proto = TurntableController.prototype\n\nproto.setDistanceLimits = function(minDist, maxDist) {\n if(minDist > 0) {\n minDist = Math.log(minDist)\n } else {\n minDist = -Infinity\n }\n if(maxDist > 0) {\n maxDist = Math.log(maxDist)\n } else {\n maxDist = Infinity\n }\n maxDist = Math.max(maxDist, minDist)\n this.radius.bounds[0][0] = minDist\n this.radius.bounds[1][0] = maxDist\n}\n\nproto.getDistanceLimits = function(out) {\n var bounds = this.radius.bounds[0]\n if(out) {\n out[0] = Math.exp(bounds[0][0])\n out[1] = Math.exp(bounds[1][0])\n return out\n }\n return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ]\n}\n\nproto.recalcMatrix = function(t) {\n //Recompute curves\n this.center.curve(t)\n this.up.curve(t)\n this.right.curve(t)\n this.radius.curve(t)\n this.angle.curve(t)\n\n //Compute frame for camera matrix\n var up = this.computedUp\n var right = this.computedRight\n var uu = 0.0\n var ur = 0.0\n for(var i=0; i<3; ++i) {\n ur += up[i] * right[i]\n uu += up[i] * up[i]\n }\n var ul = Math.sqrt(uu)\n var rr = 0.0\n for(var i=0; i<3; ++i) {\n right[i] -= up[i] * ur / uu\n rr += right[i] * right[i]\n up[i] /= ul\n }\n var rl = Math.sqrt(rr)\n for(var i=0; i<3; ++i) {\n right[i] /= rl\n }\n\n //Compute toward vector\n var toward = this.computedToward\n cross(toward, up, right)\n normalize3(toward, toward)\n\n //Compute angular parameters\n var radius = Math.exp(this.computedRadius[0])\n var theta = this.computedAngle[0]\n var phi = this.computedAngle[1]\n\n var ctheta = Math.cos(theta)\n var stheta = Math.sin(theta)\n var cphi = Math.cos(phi)\n var sphi = Math.sin(phi)\n\n var center = this.computedCenter\n\n var wx = ctheta * cphi \n var wy = stheta * cphi\n var wz = sphi\n\n var sx = -ctheta * sphi\n var sy = -stheta * sphi\n var sz = cphi\n\n var eye = this.computedEye\n var mat = this.computedMatrix\n for(var i=0; i<3; ++i) {\n var x = wx * right[i] + wy * toward[i] + wz * up[i]\n mat[4*i+1] = sx * right[i] + sy * toward[i] + sz * up[i]\n mat[4*i+2] = x\n mat[4*i+3] = 0.0\n }\n\n var ax = mat[1]\n var ay = mat[5]\n var az = mat[9]\n var bx = mat[2]\n var by = mat[6]\n var bz = mat[10]\n var cx = ay * bz - az * by\n var cy = az * bx - ax * bz\n var cz = ax * by - ay * bx\n var cl = len3(cx, cy, cz)\n cx /= cl\n cy /= cl\n cz /= cl\n mat[0] = cx\n mat[4] = cy\n mat[8] = cz\n\n for(var i=0; i<3; ++i) {\n eye[i] = center[i] + mat[2+4*i]*radius\n }\n\n for(var i=0; i<3; ++i) {\n var rr = 0.0\n for(var j=0; j<3; ++j) {\n rr += mat[i+4*j] * eye[j]\n }\n mat[12+i] = -rr\n }\n mat[15] = 1.0\n}\n\nproto.getMatrix = function(t, result) {\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n if(result) {\n for(var i=0; i<16; ++i) {\n result[i] = mat[i]\n }\n return result\n }\n return mat\n}\n\nvar zAxis = [0,0,0]\nproto.rotate = function(t, dtheta, dphi, droll) {\n this.angle.move(t, dtheta, dphi)\n if(droll) {\n this.recalcMatrix(t)\n\n var mat = this.computedMatrix\n zAxis[0] = mat[2]\n zAxis[1] = mat[6]\n zAxis[2] = mat[10]\n\n var up = this.computedUp\n var right = this.computedRight\n var toward = this.computedToward\n\n for(var i=0; i<3; ++i) {\n mat[4*i] = up[i]\n mat[4*i+1] = right[i]\n mat[4*i+2] = toward[i]\n }\n rotateM(mat, mat, droll, zAxis)\n for(var i=0; i<3; ++i) {\n up[i] = mat[4*i]\n right[i] = mat[4*i+1]\n }\n\n this.up.set(t, up[0], up[1], up[2])\n this.right.set(t, right[0], right[1], right[2])\n }\n}\n\nproto.pan = function(t, dx, dy, dz) {\n dx = dx || 0.0\n dy = dy || 0.0\n dz = dz || 0.0\n\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n\n var dist = Math.exp(this.computedRadius[0])\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n\n var vx = rx * dx + ux * dy\n var vy = ry * dx + uy * dy\n var vz = rz * dx + uz * dy\n this.center.move(t, vx, vy, vz)\n\n //Update z-component of radius\n var radius = Math.exp(this.computedRadius[0])\n radius = Math.max(1e-4, radius + dz)\n this.radius.set(t, Math.log(radius))\n}\n\nproto.translate = function(t, dx, dy, dz) {\n this.center.move(t,\n dx||0.0,\n dy||0.0,\n dz||0.0)\n}\n\n//Recenters the coordinate axes\nproto.setMatrix = function(t, mat, axes, noSnap) {\n \n //Get the axes for tare\n var ushift = 1\n if(typeof axes === 'number') {\n ushift = (axes)|0\n } \n if(ushift < 0 || ushift > 3) {\n ushift = 1\n }\n var vshift = (ushift + 2) % 3\n var fshift = (ushift + 1) % 3\n\n //Recompute state for new t value\n if(!mat) { \n this.recalcMatrix(t)\n mat = this.computedMatrix\n }\n\n //Get right and up vectors\n var ux = mat[ushift]\n var uy = mat[ushift+4]\n var uz = mat[ushift+8]\n if(!noSnap) {\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n } else {\n var ax = Math.abs(ux)\n var ay = Math.abs(uy)\n var az = Math.abs(uz)\n var am = Math.max(ax,ay,az)\n if(ax === am) {\n ux = (ux < 0) ? -1 : 1\n uy = uz = 0\n } else if(az === am) {\n uz = (uz < 0) ? -1 : 1\n ux = uy = 0\n } else {\n uy = (uy < 0) ? -1 : 1\n ux = uz = 0\n }\n }\n\n var rx = mat[vshift]\n var ry = mat[vshift+4]\n var rz = mat[vshift+8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n \n var fx = uy * rz - uz * ry\n var fy = uz * rx - ux * rz\n var fz = ux * ry - uy * rx\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n this.center.jump(t, ex, ey, ez)\n this.radius.idle(t)\n this.up.jump(t, ux, uy, uz)\n this.right.jump(t, rx, ry, rz)\n\n var phi, theta\n if(ushift === 2) {\n var cx = mat[1]\n var cy = mat[5]\n var cz = mat[9]\n var cr = cx * rx + cy * ry + cz * rz\n var cf = cx * fx + cy * fy + cz * fz\n if(tu < 0) {\n phi = -Math.PI/2\n } else {\n phi = Math.PI/2\n }\n theta = Math.atan2(cf, cr)\n } else {\n var tx = mat[2]\n var ty = mat[6]\n var tz = mat[10]\n var tu = tx * ux + ty * uy + tz * uz\n var tr = tx * rx + ty * ry + tz * rz\n var tf = tx * fx + ty * fy + tz * fz\n\n phi = Math.asin(clamp1(tu))\n theta = Math.atan2(tf, tr)\n }\n\n this.angle.jump(t, theta, phi)\n\n this.recalcMatrix(t)\n var dx = mat[2]\n var dy = mat[6]\n var dz = mat[10]\n\n var imat = this.computedMatrix\n invert44(imat, mat)\n var w = imat[15]\n var ex = imat[12] / w\n var ey = imat[13] / w\n var ez = imat[14] / w\n\n var gs = Math.exp(this.computedRadius[0])\n this.center.jump(t, ex-dx*gs, ey-dy*gs, ez-dz*gs)\n}\n\nproto.lastT = function() {\n return Math.max(\n this.center.lastT(),\n this.up.lastT(),\n this.right.lastT(),\n this.radius.lastT(),\n this.angle.lastT())\n}\n\nproto.idle = function(t) {\n this.center.idle(t)\n this.up.idle(t)\n this.right.idle(t)\n this.radius.idle(t)\n this.angle.idle(t)\n}\n\nproto.flush = function(t) {\n this.center.flush(t)\n this.up.flush(t)\n this.right.flush(t)\n this.radius.flush(t)\n this.angle.flush(t)\n}\n\nproto.setDistance = function(t, d) {\n if(d > 0) {\n this.radius.set(t, Math.log(d))\n }\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n\n eye = eye || this.computedEye\n center = center || this.computedCenter\n up = up || this.computedUp\n\n var ux = up[0]\n var uy = up[1]\n var uz = up[2]\n var ul = len3(ux, uy, uz)\n if(ul < 1e-6) {\n return\n }\n ux /= ul\n uy /= ul\n uz /= ul\n\n var tx = eye[0] - center[0]\n var ty = eye[1] - center[1]\n var tz = eye[2] - center[2]\n var tl = len3(tx, ty, tz)\n if(tl < 1e-6) {\n return\n }\n tx /= tl\n ty /= tl\n tz /= tl\n\n var right = this.computedRight\n var rx = right[0]\n var ry = right[1]\n var rz = right[2]\n var ru = ux*rx + uy*ry + uz*rz\n rx -= ru * ux\n ry -= ru * uy\n rz -= ru * uz\n var rl = len3(rx, ry, rz)\n\n if(rl < 0.01) {\n rx = uy * tz - uz * ty\n ry = uz * tx - ux * tz\n rz = ux * ty - uy * tx\n rl = len3(rx, ry, rz)\n if(rl < 1e-6) {\n return\n }\n }\n rx /= rl\n ry /= rl\n rz /= rl\n\n this.up.set(t, ux, uy, uz)\n this.right.set(t, rx, ry, rz)\n this.center.set(t, center[0], center[1], center[2])\n this.radius.set(t, Math.log(tl))\n\n var fx = uy * rz - uz * ry\n var fy = uz * rx - ux * rz\n var fz = ux * ry - uy * rx\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n var tu = ux*tx + uy*ty + uz*tz\n var tr = rx*tx + ry*ty + rz*tz\n var tf = fx*tx + fy*ty + fz*tz\n\n var phi = Math.asin(clamp1(tu))\n var theta = Math.atan2(tf, tr)\n\n var angleState = this.angle._state\n var lastTheta = angleState[angleState.length-1]\n var lastPhi = angleState[angleState.length-2]\n lastTheta = lastTheta % (2.0 * Math.PI)\n var dp = Math.abs(lastTheta + 2.0 * Math.PI - theta)\n var d0 = Math.abs(lastTheta - theta)\n var dn = Math.abs(lastTheta - 2.0 * Math.PI - theta)\n if(dp < d0) {\n lastTheta += 2.0 * Math.PI\n }\n if(dn < d0) {\n lastTheta -= 2.0 * Math.PI\n }\n\n this.angle.jump(this.angle.lastT(), lastTheta, lastPhi)\n this.angle.set(t, theta, phi)\n}\n\nfunction createTurntableController(options) {\n options = options || {}\n\n var center = options.center || [0,0,0]\n var up = options.up || [0,1,0]\n var right = options.right || findOrthoPair(up)\n var radius = options.radius || 1.0\n var theta = options.theta || 0.0\n var phi = options.phi || 0.0\n\n center = [].slice.call(center, 0, 3)\n\n up = [].slice.call(up, 0, 3)\n normalize3(up, up)\n\n right = [].slice.call(right, 0, 3)\n normalize3(right, right)\n\n if('eye' in options) {\n var eye = options.eye\n var toward = [\n eye[0]-center[0],\n eye[1]-center[1],\n eye[2]-center[2]\n ]\n cross(right, toward, up)\n if(len3(right[0], right[1], right[2]) < 1e-6) {\n right = findOrthoPair(up)\n } else {\n normalize3(right, right)\n }\n\n radius = len3(toward[0], toward[1], toward[2])\n\n var ut = dot3(up, toward) / radius\n var rt = dot3(right, toward) / radius\n phi = Math.acos(ut)\n theta = Math.acos(rt)\n }\n\n //Use logarithmic coordinates for radius\n radius = Math.log(radius)\n\n //Return the controller\n return new TurntableController(\n options.zoomMin,\n options.zoomMax,\n center,\n up,\n right,\n radius,\n theta,\n phi)\n}","module.exports = \"#version 300 es\\n\\n// This is a fragment shader. If you've opened this file first, please\\n// open and read lambert.vert.glsl before reading on.\\n// Unlike the vertex shader, the fragment shader actually does compute\\n// the shading of geometry. For every pixel in your program's output\\n// screen, the fragment shader is run for every bit of geometry that\\n// particular pixel overlaps. By implicitly interpolating the position\\n// data passed into the fragment shader by the vertex shader, the fragment shader\\n// can compute what color to apply to its pixel based on things like vertex\\n// position, light position, and vertex color.\\nprecision highp float;\\n\\nuniform vec4 u_Color; // The color with which to render this instance of geometry.\\n\\n// These are the interpolated values out of the rasterizer, so you can't know\\n// their specific values without knowing the vertices that contributed to them\\nin vec4 fs_Nor;\\nin vec4 fs_LightVec;\\nin vec4 fs_Col;\\n\\nin vec4 fs_Pos;\\n\\nout vec4 out_Col; // This is the final output color that you will see on your\\n // screen for the pixel that is currently being processed.\\n\\nvec3 random3(vec3 p) {\\n return fract(sin(vec3(dot(p, vec3(127.1, 311.7, 513.3)),\\n dot(p, vec3(269.5, 183.3, 419.2)),\\n dot(p, vec3(420.6, 631.2, 937.3))\\n )) * 43758.5453);\\n}\\n\\nfloat surflet(vec3 P, vec3 gridPoint) {\\n // Compute falloff function by converting linear distance to a polynomial\\n vec3 dist = abs(P - gridPoint);\\n vec3 t = 1.0 - 6.0 * dist * dist * dist * dist * dist\\n + 15.0 * dist * dist * dist * dist\\n - 10.0 * dist * dist * dist;\\n \\n // Get the random vector for the grid point\\n vec3 gradient = 2.0 * random3(gridPoint) - vec3(1.0);\\n \\n // Get the vector from the grid point to P\\n vec3 diff = P - gridPoint;\\n \\n // Get the value of our height field by dotting grid->P with our gradient\\n float height = dot(diff, gradient);\\n \\n // Scale our height field (i.e. reduce it) by our polynomial falloff function\\n return height * t.x * t.y * t.z;\\n}\\n\\nfloat perlinNoise(vec3 uvw) {\\n float surfletSum = 0.0;\\n \\n // Iterate over the eight integer corners surrounding uvw\\n for (int dx = 0; dx <= 1; ++dx) {\\n for (int dy = 0; dy <= 1; ++dy) {\\n for (int dz = 0; dz <= 1; ++dz) {\\n // Construct the grid point in 3D\\n vec3 gridPoint = floor(uvw) + vec3(dx, dy, dz);\\n \\n // Calculate the surflet contribution for this grid point\\n surfletSum += surflet(uvw, gridPoint);\\n }\\n }\\n }\\n \\n return surfletSum;\\n}\\n\\n\\n\\nvoid main()\\n{\\n // Material base color (before shading)\\n vec4 diffuseColor = u_Color;\\n\\n float perlinValue = 1.0 - perlinNoise(vec3(fs_Pos)/0.3);\\n \\n\\n // Calculate the diffuse term for Lambert shading\\n float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec));\\n // Avoid negative lighting values\\n // diffuseTerm = clamp(diffuseTerm, 0, 1);\\n\\n float ambientTerm = 0.2;\\n\\n float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier\\n //to simulate ambient lighting. This ensures that faces that are not\\n //lit by our point light are not completely black.\\n\\n\\n diffuseColor *=perlinValue;\\n\\n // Compute final shaded color\\n out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a);\\n}\\n\"","module.exports = \"#version 300 es\\n\\n//This is a vertex shader. While it is called a \\\"shader\\\" due to outdated conventions, this file\\n//is used to apply matrix transformations to the arrays of vertex data passed to it.\\n//Since this code is run on your GPU, each vertex is transformed simultaneously.\\n//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time.\\n//This simultaneous transformation allows your program to run much faster, especially when rendering\\n//geometry with millions of vertices.\\n\\nuniform mat4 u_Model; // The matrix that defines the transformation of the\\n // object we're rendering. In this assignment,\\n // this will be the result of traversing your scene graph.\\n\\nuniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix.\\n // This allows us to transform the object's normals properly\\n // if the object has been non-uniformly scaled.\\n\\nuniform mat4 u_ViewProj; // The matrix that defines the camera's transformation.\\n // We've written a static matrix for you to use for HW2,\\n // but in HW3 you'll have to generate one yourself\\n\\nuniform float u_Time;\\n\\nin vec4 vs_Pos; // The array of vertex positions passed to the shader\\n\\nin vec4 vs_Nor; // The array of vertex normals passed to the shader\\n\\nin vec4 vs_Col; // The array of vertex colors passed to the shader.\\n\\nout vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader.\\nout vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader.\\nout vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader.\\nout vec4 fs_Pos;\\n\\nconst vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of\\n //the geometry in the fragment shader.\\n\\nvec2 random2( vec2 p ) {\\n return fract(sin(vec2(dot(p, vec2(127.1, 311.7)),\\n dot(p, vec2(269.5,183.3))))\\n * 43758.5453);\\n}\\n\\nfloat WorleyNoise(vec2 uv) {\\n uv *= 10.0; // Now the space is 10x10 instead of 1x1. Change this to any number you want.\\n vec2 uvInt = floor(uv);\\n vec2 uvFract = fract(uv);\\n float minDist = 1.0; // Minimum distance initialized to max.\\n for(int y = -1; y <= 1; ++y) {\\n for(int x = -1; x <= 1; ++x) {\\n vec2 neighbor = vec2(float(x), float(y)); // Direction in which neighbor cell lies\\n vec2 point = random2(uvInt + neighbor); // Get the Voronoi centerpoint for the neighboring cell\\n vec2 diff = neighbor + point - uvFract; // Distance between fragment coord and neighbor’s Voronoi point\\n float dist = length(diff);\\n minDist = min(minDist, dist);\\n }\\n }\\n return minDist;\\n}\\n\\n\\n\\n\\nvoid main()\\n{\\n fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation\\n\\n mat3 invTranspose = mat3(u_ModelInvTr);\\n fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation.\\n // Transform the geometry's normals by the inverse transpose of the\\n // model matrix. This is necessary to ensure the normals remain\\n // perpendicular to the surface after the surface is transformed by\\n // the model matrix.\\n\\n \\n vec4 pos = vs_Pos;\\n //pos += vec4( vec3(pos) + 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) +0.5 , cos(u_Time/150.0))) , 0.f);\\n\\n\\n vec4 modelposition = u_Model * pos; // Temporarily store the transformed vertex positions for use below\\n\\n modelposition.x += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) + modelposition.x , cos(u_Time/150.0)));\\n modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + modelposition.y ));\\n\\n modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0);\\n\\n fs_Pos = modelposition;\\n\\n fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies\\n\\n gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is\\n // used to render the final positions of the geometry's vertices\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n\\n
\\n\\n
\\n\\n
\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","\nexport var gl: WebGL2RenderingContext;\nexport function setGL(_gl: WebGL2RenderingContext) {\n gl = _gl;\n}\n","import {gl} from '../../globals';\n\nabstract class Drawable {\n count: number = 0;\n\n bufIdx: WebGLBuffer;\n bufPos: WebGLBuffer;\n bufNor: WebGLBuffer;\n\n idxBound: boolean = false;\n posBound: boolean = false;\n norBound: boolean = false;\n\n abstract create() : void;\n\n destory() {\n gl.deleteBuffer(this.bufIdx);\n gl.deleteBuffer(this.bufPos);\n gl.deleteBuffer(this.bufNor);\n }\n\n generateIdx() {\n this.idxBound = true;\n this.bufIdx = gl.createBuffer();\n }\n\n generatePos() {\n this.posBound = true;\n this.bufPos = gl.createBuffer();\n }\n\n generateNor() {\n this.norBound = true;\n this.bufNor = gl.createBuffer();\n }\n\n bindIdx(): boolean {\n if (this.idxBound) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n }\n return this.idxBound;\n }\n\n bindPos(): boolean {\n if (this.posBound) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n }\n return this.posBound;\n }\n\n bindNor(): boolean {\n if (this.norBound) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n }\n return this.norBound;\n }\n\n elemCount(): number {\n return this.count;\n }\n\n drawMode(): GLenum {\n return gl.TRIANGLES;\n }\n};\n\nexport default Drawable;\n","import {vec3, vec4} from 'gl-matrix';\nimport Drawable from '../rendering/gl/Drawable';\nimport {gl} from '../globals';\n\nclass Icosphere extends Drawable {\n buffer: ArrayBuffer;\n indices: Uint32Array;\n positions: Float32Array;\n normals: Float32Array;\n center: vec4;\n\n constructor(center: vec3, public radius: number, public subdivisions: number) {\n super(); // Call the constructor of the super class. This is required.\n this.center = vec4.fromValues(center[0], center[1], center[2], 1);\n }\n\n create() {\n const X = 0.525731112119133606;\n const Z = 0.850650808352039932;\n const N = 0;\n\n let maxIndexCount = 20 * Math.pow(4, this.subdivisions);\n let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2;\n\n // Create buffers to back geometry data\n // Index data will ping pong back and forth between buffer0 and buffer1 during creation\n // All data will be in buffer0 at the end\n const buffer0 = new ArrayBuffer(\n maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT +\n maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT +\n maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT\n );\n const buffer1 = new ArrayBuffer(\n maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT\n );\n const buffers = [buffer0, buffer1];\n let b = 0;\n\n const indexByteOffset = 0;\n const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT;\n const normalByteOffset = vertexByteOffset;\n const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT;\n\n // Create 3-uint buffer views into the backing buffer to represent triangles\n // The C++ analogy to this would be something like:\n // triangles[i] = reinterpret_cast*>(&buffer[offset]);\n let triangles: Array = new Array(20);\n let nextTriangles: Array = new Array();\n for (let i = 0; i < 20; ++i) {\n triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n }\n\n // Create 3-float buffer views into the backing buffer to represent positions\n let vertices: Array = new Array(12);\n for (let i = 0; i < 12; ++i) {\n vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n }\n\n // Initialize normals for a 20-sided icosahedron\n vertices[0].set([ -X,N,Z,0 ]);\n vertices[1].set([ X,N,Z,0 ]);\n vertices[2].set([ -X,N,-Z,0 ]);\n vertices[3].set([ X,N,-Z,0 ]);\n vertices[4].set([ N,Z,X,0 ]);\n vertices[5].set([ N,Z,-X,0 ]);\n vertices[6].set([ N,-Z,X,0 ]);\n vertices[7].set([ N,-Z,-X,0 ]);\n vertices[8].set([ Z,X,N,0 ]);\n vertices[9].set([ -Z,X, N,0 ]);\n vertices[10].set([ Z,-X,N,0 ]);\n vertices[11].set([ -Z,-X,N,0 ]);\n\n // Initialize indices for a 20-sided icosahedron\n triangles[0].set([ 0,4,1 ]);\n triangles[1].set([ 0,9,4 ]);\n triangles[2].set([ 9,5,4 ]);\n triangles[3].set([ 4,5,8 ]);\n triangles[4].set([ 4,8,1 ]);\n triangles[5].set([ 8,10,1 ]);\n triangles[6].set([ 8,3,10 ]);\n triangles[7].set([ 5,3,8 ]);\n triangles[8].set([ 5,2,3 ]);\n triangles[9].set([ 2,7,3 ]);\n triangles[10].set([ 7,10,3 ]);\n triangles[11].set([ 7,6,10 ]);\n triangles[12].set([ 7,11,6 ]);\n triangles[13].set([ 11,0,6 ]);\n triangles[14].set([ 0,1,6 ],);\n triangles[15].set([ 6,1,10 ]);\n triangles[16].set([ 9,0,11 ]);\n triangles[17].set([ 9,11,2 ]);\n triangles[18].set([ 9,2,5 ]);\n triangles[19].set([ 7,2,11 ]);\n\n // This loop subdivides the icosahedron\n for (let s = 0; s < this.subdivisions; ++s) {\n b = 1 - b;\n nextTriangles.length = triangles.length * 4;\n let triangleIdx = 0;\n\n // edgeMap maps a pair of vertex indices to a vertex index at their midpoint\n // The function `mid` will get that midpoint vertex if it has already been created\n // or it will create the vertex and add it to the map\n let edgeMap: Map = new Map();\n function mid(v0: number, v1: number): number {\n let key = [v0, v1].sort().join('_');\n if (!edgeMap.has(key)) {\n let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n vec4.add(midpoint, vertices[v0], vertices[v1]);\n vec4.normalize(midpoint, midpoint);\n edgeMap.set(key, vertices.length);\n vertices.push(midpoint);\n }\n return edgeMap.get(key);\n }\n\n for (let t = 0; t < triangles.length; ++t) {\n let v0 = triangles[t][0];\n let v1 = triangles[t][1];\n let v2 = triangles[t][2];\n let v3 = mid(v0, v1); // Get or create a vertex between these two vertices\n let v4 = mid(v1, v2);\n let v5 = mid(v2, v0);\n\n let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n\n let triangleOffset = nextTriangles.length;\n t0.set([v0, v3, v5]);\n t1.set([v3, v4, v5]);\n t2.set([v3, v1, v4]);\n t3.set([v5, v4, v2]);\n }\n\n // swap buffers\n let temp = triangles;\n triangles = nextTriangles;\n nextTriangles = temp;\n }\n\n if (b === 1) {\n // if indices did not end up in buffer0, copy them there now\n let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length);\n let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length);\n temp0.set(temp1);\n }\n\n // Populate one position for each normal\n for (let i = 0; i < vertices.length; ++i) {\n let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius);\n }\n\n this.buffer = buffer0;\n this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3);\n this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4);\n this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4);\n\n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created icosphere with ${vertices.length} vertices`);\n }\n};\n\nexport default Icosphere;\n","import {vec3, vec4} from 'gl-matrix';\nimport Drawable from '../rendering/gl/Drawable';\nimport {gl} from '../globals';\n\nclass Square extends Drawable {\n indices: Uint32Array;\n positions: Float32Array;\n normals: Float32Array;\n center: vec4;\n\n constructor(center: vec3) {\n super(); // Call the constructor of the super class. This is required.\n this.center = vec4.fromValues(center[0], center[1], center[2], 1);\n }\n\n create() {\n\n this.indices = new Uint32Array([0, 1, 2,\n 0, 2, 3]);\n this.normals = new Float32Array([0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0]);\n this.positions = new Float32Array([-1, -1, 0, 1,\n 1, -1, 0, 1,\n 1, 1, 0, 1,\n -1, 1, 0, 1]);\n\n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created square`);\n }\n};\n\nexport default Square;\n","import * as glMatrix from \"./common.js\";\n/**\r\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nexport function perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","import {mat4, vec4} from 'gl-matrix';\nimport Drawable from './Drawable';\nimport Camera from '../../Camera';\nimport {gl} from '../../globals';\nimport ShaderProgram from './ShaderProgram';\n\n// In this file, `gl` is accessible because it is imported above\nclass OpenGLRenderer {\n constructor(public canvas: HTMLCanvasElement) {\n }\n\n setClearColor(r: number, g: number, b: number, a: number) {\n gl.clearColor(r, g, b, a);\n }\n\n setSize(width: number, height: number) {\n this.canvas.width = width;\n this.canvas.height = height;\n }\n\n clear() {\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n }\n\n render(camera: Camera, prog: ShaderProgram, drawables: Array) {\n let model = mat4.create();\n let viewProj = mat4.create();\n let color = vec4.fromValues(1, 0, 0, 1);\n\n mat4.identity(model);\n mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix);\n prog.setModelMatrix(model);\n prog.setViewProjMatrix(viewProj);\n //prog.setGeometryColor(color);\n\n for (let drawable of drawables) {\n prog.draw(drawable);\n }\n }\n};\n\nexport default OpenGLRenderer;\n","var CameraControls = require('3d-view-controls');\nimport {vec3, mat4} from 'gl-matrix';\n\nclass Camera {\n controls: any;\n projectionMatrix: mat4 = mat4.create();\n viewMatrix: mat4 = mat4.create();\n fovy: number = 45;\n aspectRatio: number = 1;\n near: number = 0.1;\n far: number = 1000;\n position: vec3 = vec3.create();\n direction: vec3 = vec3.create();\n target: vec3 = vec3.create();\n up: vec3 = vec3.create();\n\n constructor(position: vec3, target: vec3) {\n this.controls = CameraControls(document.getElementById('canvas'), {\n eye: position,\n center: target,\n });\n vec3.add(this.target, this.position, this.direction);\n mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up);\n }\n\n setAspectRatio(aspectRatio: number) {\n this.aspectRatio = aspectRatio;\n }\n\n updateProjectionMatrix() {\n mat4.perspective(this.projectionMatrix, this.fovy, this.aspectRatio, this.near, this.far);\n }\n\n update() {\n this.controls.tick();\n vec3.add(this.target, this.position, this.direction);\n mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up);\n }\n};\n\nexport default Camera;\n","import {vec4, mat4} from 'gl-matrix';\nimport Drawable from './Drawable';\nimport {gl} from '../../globals';\n\nvar activeProgram: WebGLProgram = null;\n\nexport class Shader {\n shader: WebGLShader;\n\n constructor(type: number, source: string) {\n this.shader = gl.createShader(type);\n gl.shaderSource(this.shader, source);\n gl.compileShader(this.shader);\n\n if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) {\n throw gl.getShaderInfoLog(this.shader);\n }\n }\n};\n\nclass ShaderProgram {\n prog: WebGLProgram;\n\n attrPos: number;\n attrNor: number;\n attrCol: number;\n //attrTime: number;\n\n unifModel: WebGLUniformLocation;\n unifModelInvTr: WebGLUniformLocation;\n unifViewProj: WebGLUniformLocation;\n unifColor: WebGLUniformLocation;\n unifTime: WebGLUniformLocation;\n\n constructor(shaders: Array) {\n this.prog = gl.createProgram();\n\n for (let shader of shaders) {\n gl.attachShader(this.prog, shader.shader);\n }\n gl.linkProgram(this.prog);\n if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) {\n throw gl.getProgramInfoLog(this.prog);\n }\n\n this.attrPos = gl.getAttribLocation(this.prog, \"vs_Pos\");\n this.attrNor = gl.getAttribLocation(this.prog, \"vs_Nor\");\n this.attrCol = gl.getAttribLocation(this.prog, \"vs_Col\");\n this.unifModel = gl.getUniformLocation(this.prog, \"u_Model\");\n this.unifModelInvTr = gl.getUniformLocation(this.prog, \"u_ModelInvTr\");\n this.unifViewProj = gl.getUniformLocation(this.prog, \"u_ViewProj\");\n this.unifColor = gl.getUniformLocation(this.prog, \"u_Color\");\n this.unifTime = gl.getUniformLocation(this.prog, \"u_Time\");\n }\n\n use() {\n if (activeProgram !== this.prog) {\n gl.useProgram(this.prog);\n activeProgram = this.prog;\n }\n }\n\n setModelMatrix(model: mat4) {\n this.use();\n if (this.unifModel !== -1) {\n gl.uniformMatrix4fv(this.unifModel, false, model);\n }\n\n if (this.unifModelInvTr !== -1) {\n let modelinvtr: mat4 = mat4.create();\n mat4.transpose(modelinvtr, model);\n mat4.invert(modelinvtr, modelinvtr);\n gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr);\n }\n }\n\n setViewProjMatrix(vp: mat4) {\n this.use();\n if (this.unifViewProj !== -1) {\n gl.uniformMatrix4fv(this.unifViewProj, false, vp);\n }\n }\n\n setGeometryColor(color: vec4) {\n this.use();\n if (this.unifColor !== -1) {\n gl.uniform4fv(this.unifColor, color);\n }\n }\n\n setUniformVec4(name : string, value : vec4)\n {\n this.use();\n var location = gl.getUniformLocation(this.prog, name);\n if (location !== -1) {\n gl.uniform4fv(location, value);\n }\n }\n \n setTime(time: number) {\n this.use();\n if (this.unifTime !== -1) {\n gl.uniform1f(this.unifTime, time);\n }\n }\n \n draw(d: Drawable) {\n this.use();\n\n if (this.attrPos != -1 && d.bindPos()) {\n gl.enableVertexAttribArray(this.attrPos);\n gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0);\n }\n\n if (this.attrNor != -1 && d.bindNor()) {\n gl.enableVertexAttribArray(this.attrNor);\n gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0);\n }\n\n d.bindIdx();\n gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0);\n\n if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos);\n if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor);\n }\n};\n\nexport default ShaderProgram;\n","import { vec3, vec4 } from 'gl-matrix';\nimport Drawable from '../rendering/gl/Drawable';\nimport { gl } from '../globals';\n\nclass Cube extends Drawable {\n indices: Uint32Array;\n positions: Float32Array;\n normals: Float32Array;\n center: vec4;\n size: number; \n constructor(center: vec3, size: number) {\n super(); \n this.center = vec4.fromValues(center[0], center[1], center[2], 1);\n this.size = size;\n }\n\n create() {\n const halfSize = this.size / 2;\n\n this.positions = new Float32Array([\n // Front face\n -0.5, -0.5, 0.5, 1.0,\n 0.5, -0.5, 0.5, 1.0,\n 0.5, 0.5, 0.5, 1.0,\n -0.5, 0.5, 0.5, 1.0,\n\n // Back face\n -0.5, -0.5, -0.5, 1.0,\n 0.5, -0.5, -0.5, 1.0,\n 0.5, 0.5, -0.5, 1.0,\n -0.5, 0.5, -0.5, 1.0,\n\n // Top face\n -0.5, 0.5, 0.5, 1.0,\n 0.5, 0.5, 0.5, 1.0,\n 0.5, 0.5, -0.5, 1.0,\n -0.5, 0.5, -0.5, 1.0,\n\n // Bottom face\n -0.5, -0.5, 0.5, 1.0,\n 0.5, -0.5, 0.5, 1.0,\n 0.5, -0.5, -0.5, 1.0,\n -0.5, -0.5, -0.5, 1.0,\n\n // Right face\n 0.5, -0.5, 0.5, 1.0,\n 0.5, -0.5, -0.5, 1.0,\n 0.5, 0.5, -0.5, 1.0,\n 0.5, 0.5, 0.5, 1.0,\n\n // Left face\n -0.5, -0.5, 0.5, 1.0,\n -0.5, -0.5, -0.5, 1.0,\n -0.5, 0.5, -0.5, 1.0,\n -0.5, 0.5, 0.5, 1.0,\n ]);\n\n this.normals = new Float32Array([\n // Front face normals\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n\n // Back face normals\n 0, 0, -1, 0,\n 0, 0, -1, 0,\n 0, 0, -1, 0,\n 0, 0, -1, 0,\n\n // Top face normals\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n\n // Bottom face normals\n 0, -1, 0, 0,\n 0, -1, 0, 0,\n 0, -1, 0, 0,\n 0, -1, 0, 0,\n\n // Right face normals\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n\n // Left face normals\n -1, 0, 0, 0,\n -1, 0, 0, 0,\n -1, 0, 0, 0,\n -1, 0, 0, 0,\n ]);\n\n this.indices = new Uint32Array([\n 0, 1, 2, 0, 2, 3, // Front face\n 4, 5, 6, 4, 6, 7, // Back face\n 8, 9, 10, 8, 10, 11, // Top face\n 12, 13, 14, 12, 14, 15, // Bottom face\n 16, 17, 18, 16, 18, 19, // Right face\n 20, 21, 22, 20, 22, 23, // Left face\n ]);\n \n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created cube`);\n }\n}\n\nexport default Cube;","import {vec3, vec4, mat4} from 'gl-matrix';\nconst Stats = require('stats-js');\nimport * as DAT from 'dat.gui';\nimport Icosphere from './geometry/Icosphere';\nimport Square from './geometry/Square';\nimport OpenGLRenderer from './rendering/gl/OpenGLRenderer';\nimport Camera from './Camera';\nimport {setGL} from './globals';\nimport ShaderProgram, {Shader} from './rendering/gl/ShaderProgram';\n\nimport Cube from './geometry/cube';\n\n// Define an object with application parameters and button callbacks\n// This will be referred to by dat.GUI's functions that add GUI elements.\nconst controls = {\n tesselations: 5,\n 'Load Scene': loadScene, // A function pointer, essentially\n color: [255.0, 0.0, 0.0], \n};\n\nlet icosphere: Icosphere;\nlet square: Square;\nlet prevTesselations: number = 5;\nlet prevColor : number[] = [255.0, 0.0, 0.0];\nlet cube: Cube;\nlet time: number = 0;\n\nfunction loadScene() {\n icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations);\n icosphere.create();\n square = new Square(vec3.fromValues(0, 0, 0));\n square.create();\n\n cube = new Cube(vec3.fromValues(0, 0, 0), 1);\n cube.create();\n}\n\nfunction main() {\n // Initial display for framerate\n const stats = Stats();\n stats.setMode(0);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n // Add controls to the gui\n const gui = new DAT.GUI();\n gui.add(controls, 'tesselations', 0, 8).step(1);\n gui.addColor(controls, 'color');\n gui.add(controls, 'Load Scene');\n\n // get canvas and webgl context\n const canvas = document.getElementById('canvas');\n const gl = canvas.getContext('webgl2');\n if (!gl) {\n alert('WebGL 2 not supported!');\n }\n // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module.\n // Later, we can import `gl` from `globals.ts` to access it\n setGL(gl);\n\n // Initial call to load scene\n loadScene();\n\n const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0));\n\n const renderer = new OpenGLRenderer(canvas);\n renderer.setClearColor(0.2, 0.2, 0.2, 1);\n gl.enable(gl.DEPTH_TEST);\n\n // const lambert = new ShaderProgram([\n // new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')),\n // new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')),\n // ]);\n\n\n\n const custom_shader = new ShaderProgram([\n new Shader(gl.VERTEX_SHADER, require('./shaders/custom-vert.glsl')),\n new Shader(gl.FRAGMENT_SHADER, require('./shaders/custom-frag.glsl')),\n ]);\n\n\n function updateColor() {\n const [r, g, b] = controls.color;\n //lambert.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1));\n custom_shader.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1));\n \n }\n\n // This function will be called every frame\n function tick() {\n camera.update();\n stats.begin();\n gl.viewport(0, 0, window.innerWidth, window.innerHeight);\n renderer.clear();\n\n if(controls.tesselations != prevTesselations)\n {\n prevTesselations = controls.tesselations;\n icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations);\n icosphere.create();\n }\n\n //add time\n if (controls.color != prevColor) {\n prevColor = controls.color;\n\n updateColor();\n }\n\n time = time + 1;\n custom_shader.setTime(time);\n \n renderer.render(camera, custom_shader, [\n //icosphere,\n // square,\n cube,\n ]);\n stats.end();\n\n // Tell the browser to call `tick` again whenever it renders a new frame\n requestAnimationFrame(tick);\n }\n\n window.addEventListener('resize', function() {\n renderer.setSize(window.innerWidth, window.innerHeight);\n camera.setAspectRatio(window.innerWidth / window.innerHeight);\n camera.updateProjectionMatrix();\n }, false);\n\n renderer.setSize(window.innerWidth, window.innerHeight);\n camera.setAspectRatio(window.innerWidth / window.innerHeight);\n camera.updateProjectionMatrix();\n\n // Start the render loop\n tick();\n}\n\nmain();\n"],"names":["module","exports","element","options","document","body","limits","Infinity","distanceLimits","zoomMin","zoomMax","view","createView","center","up","eye","mode","pmatrix","distance","width","clientWidth","height","clientHeight","camera","delay","rotateSpeed","zoomSpeed","translateSpeed","flipX","flipY","modes","tick","t","now","this","idle","flush","ctime","recalcMatrix","allEqual","matrix","computedMatrix","i","sizeChanged","Math","exp","computedRadius","lookAt","lastT","rotate","pitch","yaw","roll","pan","dx","dy","dz","translate","Object","defineProperties","get","set","mat","setMatrix","enumerable","getMode","setMode","computedCenter","ncenter","computedEye","neye","computedUp","nup","d","setDistance","getDistanceLimits","v","setDistanceLimits","addEventListener","ev","preventDefault","lastX","lastY","lastMods","shift","control","alt","meta","handleInteraction","buttons","x","y","mods","scale","drot","PI","kzoom","window","innerHeight","mouseChange","xy","mouseOffset","changedTouches","hasPassive","passive","mouseWheel","abs","innerWidth","turntable","createTurntable","orbit","createOrbit","createMatrix","ViewController","controllers","_controllerNames","keys","_controllerList","map","n","_mode","_active","proto","prototype","a0","cc","length","a1","a2","a3","getDistance","out","idx","indexOf","prev","next","max","ge","a","c","l","h","m","undefined","gt","lt","le","eq","p","norm","f","p0","v0","p1","v1","ti","t2","ti2","h00","h10","h01","h11","Array","derivative","dh00","dh10","dh01","dh11","initState","initVelocity","initTime","arguments","FilteredVector","zero","getZero","Error","cubicHermite","bsearch","clamp","lo","hi","min","state0","velocity0","t0","dimension","bounds","_state","slice","reverse","_velocity","_time","_scratch","result","splice","curve","time","state","velocity","ptr","tf","dt","x0","x1","steady","dcurve","stable","jump","push","j","sf","xc","move","statePtr","Float32Array","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","q","z","w","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","xz","yz","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","identity","y0","y1","z0","z1","len","eyex","eyey","eyez","upx","upy","upz","centerx","centery","centerz","sqrt","b","b0","b1","b2","b3","rad","axis","s","b12","b20","b21","b22","sin","cos","omega","cosom","sinom","scale0","scale1","ax","ay","az","aw","bx","by","bz","bw","acos","isBrowser","supported","opts","defineProperty","removeEventListener","e","detect","normalize","create","clone","determinant","invert","transpose","vec3","dot","cross","tmp","perspectiveMatrix","tmpVec4","row","pdum3","combine","scale2","translation","skew","perspective","quaternion","mat4x4","mat3from4","m44","lerp","recompose","decompose","slerp","state1","start","end","alpha","r0","r1","mat4","multiply","fromRotationTranslation","temp","m4interp","invert44","rotateX","rotateY","rotateZ","DEFAULT_CENTER","MatrixCameraController","initialMatrix","_components","prevMatrix","nextMatrix","computedInverse","_limits","tidx","comps","imat","radius","mc","d2","pow","log","tvec","lim","callback","buttonState","attached","updateMods","changed","altKey","shiftKey","ctrlKey","metaKey","handleEvent","nextButtons","nextX","mouse","nextY","clearState","handleBlur","handleMods","handleMouseMove","handleMouseDown","handleMouseUp","attachListeners","enabled","rootPosition","left","top","target","currentTarget","srcElement","isArray","cx","clientX","cy","clientY","rect","getBoundingClientRect","mouseElement","which","button","offsetX","offsetY","toPX","noScroll","lineHeight","listener","deltaX","deltaY","deltaZ","deltaMode","rx","ry","rz","ux","uy","uz","fx","fy","fz","tr","rotation","call","normalize4","OrbitCameraController","filterVector","mat4FromQuat","quatFromFrame","len3","len4","al","initQuat","initCenter","initRadius","computedRotation","quat","rr","getMatrix","ul","ru","rl","fu","fr","fl","vx","vy","vz","qx","qy","qz","bl","cz","cw","cl","r","toJSON","fromJSON","str","String","num","parseFloat","match","g","performance","Date","createElement","appendChild","dom","children","style","display","cssText","o","Panel","self","memory","REVISION","addPanel","showPanel","begin","update","usedJSHeapSize","jsHeapSizeLimit","domElement","round","devicePixelRatio","u","getContext","font","textBaseline","fillStyle","fillRect","fillText","globalAlpha","drawImage","parseUnit","PIXELS_PER_INCH","getSizeBrutal","getPropertyInPX","prop","parts","getComputedStyle","getPropertyValue","unit","testDIV","size","removeChild","trim","toLowerCase","isNaN","px","right","findOrthoPair","theta","phi","normalize3","toward","ut","dot3","rt","TurntableController","rotateM","clamp1","vv","uv","angle","computedRight","computedAngle","computedToward","minDist","maxDist","uu","ur","ctheta","stheta","cphi","sphi","sx","sy","sz","zAxis","dtheta","dphi","droll","axes","noSnap","ushift","vshift","am","ex","ey","ez","cr","cf","tu","atan2","tx","ty","tz","asin","gs","tl","angleState","lastTheta","lastPhi","dp","d0","dn","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","globalThis","Function","EPSILON","ARRAY_TYPE","fromValues","add","colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","toFixed","hex","random","hypot","ARR_EACH","forEach","ARR_SLICE","Common","BREAK","extend","each","obj","isObject","key","isUndefined","bind","defaults","compose","toCall","args","apply","itr","scope","_key","defer","fnc","setTimeout","debounce","func","threshold","callImmediately","timeout","callNow","clearTimeout","toArray","isNull","_isNaN","_x","constructor","isNumber","isString","isBoolean","isFunction","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","space","parseInt","write","SIX_CHAR_HEX","CSS_RGB","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","floor","rgb_to_hsv","delta","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","value","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","props","descriptor","configurable","writable","protoProps","staticProps","object","property","receiver","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","inherits","subClass","superClass","setPrototypeOf","__proto__","possibleConstructorReturn","ReferenceError","Color","defineRGBComponent","component","componentHexIndex","recalculateRGB","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","k","CSS_VALUE_PIXELS","cssValueToPixels","val","makeSelectable","elem","selectable","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","position","bottom","fakeEvent","eventType","pars","aux","params","className","evt","createEvent","initMouseEvent","bubbles","cancelable","clickCount","init","initKeyboardEvent","initKeyEvent","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","attachEvent","unbind","detachEvent","addClass","classes","split","join","replace","removeClass","removeAttribute","index","hasClass","RegExp","getWidth","getHeight","getOffset","el","offset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","type","href","BooleanController","_Controller","_this2","_this","__prev","__checkbox","setAttribute","setValue","checked","OptionController","__select","opt","innerHTML","desiredValue","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","_NumberController","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","decimals","tenTo","i1","i2","o1","o2","NumberControllerSlider","bgRect","__background","onTouchMove","touches","onTouchEnd","__foreground","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","onBlur","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","zIndex","borderRight","marginRight","cursor","background","linearGradient","outline","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","opacity","WebkitTransition","transition","hide","webkitTransform","layout","cssContent","indoc","doc","injected","head","getElementsByTagName","css","___$insertStyle","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","load","preset","scrollable","root","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","gui","__preset_select","setPresetSelectIndex","revert","setWidth","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","stringify","getSaveObject","saveToLocalStorageIfPossible","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","container","CLASS_CONTROLLER_ROW","__gui","_options","nextSibling","nextElementSibling","remove","_nextSibling","_name","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","augmentController","location","addPresetOption","setSelected","showHideExplain","explain","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","__save_row","getCurrentPreset","useInitialValues","savedValues","updateDisplays","controllerArray","toggleHide","CLASS_TOO_TALL","_keydownHandler","addColor","destroy","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","show","node","offsetHeight","remember","div","firstChild","gears","button2","button3","select","getElementById","localStorageCheckBox","newConstructorTextArea","focus","save","presetName","prompt","saveAs","addSaveMenu","gl","GUI$1","setGL","_gl","count","idxBound","posBound","norBound","destory","deleteBuffer","bufIdx","bufPos","bufNor","generateIdx","createBuffer","generatePos","generateNor","bindIdx","bindBuffer","ELEMENT_ARRAY_BUFFER","bindPos","ARRAY_BUFFER","bindNor","elemCount","drawMode","TRIANGLES","subdivisions","super","X","Z","maxIndexCount","maxVertexCount","buffer0","ArrayBuffer","Uint32Array","BYTES_PER_ELEMENT","buffer1","buffers","vertexByteOffset","normalByteOffset","positionByteOffset","triangles","nextTriangles","vertices","triangleIdx","edgeMap","Map","mid","sort","has","midpoint","v2","v3","v4","v5","t1","t3","temp0","temp1","buffer","indices","normals","positions","bufferData","STATIC_DRAW","console","canvas","setClearColor","clearColor","setSize","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","render","prog","drawables","model","viewProj","projectionMatrix","viewMatrix","setModelMatrix","setViewProjMatrix","drawable","draw","CameraControls","fovy","aspectRatio","near","far","direction","controls","setAspectRatio","updateProjectionMatrix","aspect","nf","tan","activeProgram","Shader","source","shader","createShader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","shaders","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","attrPos","getAttribLocation","attrNor","attrCol","unifModel","getUniformLocation","unifModelInvTr","unifViewProj","unifColor","unifTime","use","useProgram","uniformMatrix4fv","modelinvtr","vp","setGeometryColor","uniform4fv","setUniformVec4","setTime","uniform1f","enableVertexAttribArray","vertexAttribPointer","FLOAT","drawElements","UNSIGNED_INT","disableVertexAttribArray","Stats","tesselations","loadScene","icosphere","square","prevTesselations","prevColor","stats","alert","renderer","enable","DEPTH_TEST","custom_shader","VERTEX_SHADER","FRAGMENT_SHADER","viewport","updateColor","main"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.html b/index.html similarity index 100% rename from dist/index.html rename to index.html diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 2829bfcd..00000000 --- a/package-lock.json +++ /dev/null @@ -1,3850 +0,0 @@ -{ - "name": "hw00-intro-base", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "hw00-intro-base", - "dependencies": { - "3d-view-controls": "^2.2.2", - "dat.gui": "^0.7.7", - "gl-matrix": "^3.3.0", - "stats-js": "^1.0.1" - }, - "devDependencies": { - "@types/dat.gui": "^0.7.7", - "@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, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", - "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@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/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.36", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", - "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "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 - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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 - }, - "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "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, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "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, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "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, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "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 - }, - "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 - }, - "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.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "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, - "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" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "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, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "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 - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", - "dev": true, - "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" - } - }, - "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 - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "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, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.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" - } - }, - "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, - "engines": { - "node": ">=6.0" - } - }, - "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, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, - "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 - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cubic-hermite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", - "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" - }, - "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==" - }, - "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, - "dependencies": { - "ms": "2.0.0" - } - }, - "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, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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 - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "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 - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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 - }, - "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, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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, - "dependencies": { - "estraverse": "^5.2.0" - }, - "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" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "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" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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 - }, - "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 - }, - "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 - }, - "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, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "binary-search-bounds": "^2.0.0", - "cubic-hermite": "^1.0.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "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" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", - "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", - "dev": true - }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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 - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gl-mat3": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", - "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" - }, - "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==" - }, - "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==" - }, - "node_modules/gl-quat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", - "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", - "dependencies": { - "gl-mat3": "^1.0.0", - "gl-vec3": "^1.0.3", - "gl-vec4": "^1.0.0" - } - }, - "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==" - }, - "node_modules/gl-vec4": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", - "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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 - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/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 - }, - "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, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "is-browser": "^2.0.1" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "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": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/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 - }, - "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 - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "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, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "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" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "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, - "engines": { - "node": ">=10.17.0" - } - }, - "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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">= 0.10" - } - }, - "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, - "engines": { - "node": ">= 10" - } - }, - "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, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "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, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=0.12.0" - } - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "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 - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "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 - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "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, - "engines": { - "node": ">=6.11.5" - } - }, - "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, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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=", - "dependencies": { - "gl-mat4": "^1.0.1", - "gl-vec3": "^1.0.2" - } - }, - "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=", - "dependencies": { - "gl-mat4": "^1.0.1", - "gl-vec3": "^1.0.2", - "mat4-decompose": "^1.0.3", - "mat4-recompose": "^1.0.3", - "quat-slerp": "^1.0.0" - } - }, - "node_modules/mat4-recompose": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", - "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", - "dependencies": { - "gl-mat4": "^1.0.1" - } - }, - "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==", - "dependencies": { - "binary-search-bounds": "^2.0.0", - "gl-mat4": "^1.1.2", - "gl-vec3": "^1.0.3", - "mat4-interpolate": "^1.0.3" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "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 - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "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, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "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 - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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=", - "dependencies": { - "mouse-event": "^1.0.0" - } - }, - "node_modules/mouse-event": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" - }, - "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=" - }, - "node_modules/mouse-wheel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", - "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", - "dependencies": { - "right-now": "^1.0.0", - "signum": "^1.0.0", - "to-px": "^1.0.1" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "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 - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "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, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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" - } - }, - "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=", - "dependencies": { - "filtered-vector": "^1.2.1", - "gl-mat4": "^1.0.3" - } - }, - "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, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-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, - "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "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 - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-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 - }, - "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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "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, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "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" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quat-slerp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", - "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", - "dependencies": { - "gl-quat": "^1.0.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "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, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "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, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/right-now": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "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" - } - }, - "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 - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/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/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "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, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "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": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "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, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "node_modules/signum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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, - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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, - "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": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==" - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "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/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "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==", - "dependencies": { - "parse-unit": "^1.0.1" - } - }, - "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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "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, - "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" - } - }, - "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=", - "dependencies": { - "filtered-vector": "^1.2.1", - "gl-mat4": "^1.0.2", - "gl-vec3": "^1.0.2" - } - }, - "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, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "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 - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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 - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "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, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.4", - "@webpack-cli/info": "^1.3.0", - "@webpack-cli/serve": "^1.5.2", - "colorette": "^1.2.1", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", - "webpack-merge": "^5.7.3" - }, - "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 - } - } - }, - "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.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "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, - "dependencies": { - "fs": "0.0.2", - "path": "^0.11.14" - } - }, - "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, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "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, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", - "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 - } - } - }, - "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 - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 16277910..00000000 --- a/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "scripts": { - "start": "webpack-dev-server --no-hot --live-reload", - "build": "webpack" - }, - "devDependencies": { - "@types/dat.gui": "^0.7.7", - "@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" - }, - "dependencies": { - "3d-view-controls": "^2.2.2", - "dat.gui": "^0.7.7", - "gl-matrix": "^3.3.0", - "stats-js": "^1.0.1" - } -} diff --git a/pic0.png b/pic0.png deleted file mode 100644 index 5050a8d5ace16ee4303475ad65b7a96118442b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80597 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
v!_PbvgJ$ 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 szJF&Vw-}q(z6cAQBz&qkVB|Zi>CY! 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 diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json deleted file mode 100644 index 7a73a41b..00000000 --- a/src/.vscode/settings.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file diff --git a/src/Camera.ts b/src/Camera.ts deleted file mode 100644 index 77a76105..00000000 --- a/src/Camera.ts +++ /dev/null @@ -1,41 +0,0 @@ -var CameraControls = require('3d-view-controls'); -import {vec3, mat4} from 'gl-matrix'; - -class Camera { - controls: any; - projectionMatrix: mat4 = mat4.create(); - viewMatrix: mat4 = mat4.create(); - fovy: number = 45; - aspectRatio: number = 1; - near: number = 0.1; - far: number = 1000; - position: vec3 = vec3.create(); - direction: vec3 = vec3.create(); - target: vec3 = vec3.create(); - up: vec3 = vec3.create(); - - constructor(position: vec3, target: vec3) { - this.controls = CameraControls(document.getElementById('canvas'), { - eye: position, - center: target, - }); - vec3.add(this.target, this.position, this.direction); - mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); - } - - setAspectRatio(aspectRatio: number) { - this.aspectRatio = aspectRatio; - } - - updateProjectionMatrix() { - mat4.perspective(this.projectionMatrix, this.fovy, this.aspectRatio, this.near, this.far); - } - - update() { - this.controls.tick(); - vec3.add(this.target, this.position, this.direction); - mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); - } -}; - -export default Camera; diff --git a/src/geometry/Icosphere.ts b/src/geometry/Icosphere.ts deleted file mode 100644 index 412995ba..00000000 --- a/src/geometry/Icosphere.ts +++ /dev/null @@ -1,179 +0,0 @@ -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 deleted file mode 100644 index 1a21a10d..00000000 --- a/src/geometry/Square.ts +++ /dev/null @@ -1,47 +0,0 @@ -import {vec3, vec4} from 'gl-matrix'; -import Drawable from '../rendering/gl/Drawable'; -import {gl} from '../globals'; - -class Square 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]); - 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); - - console.log(`Created square`); - } -}; - -export default Square; diff --git a/src/geometry/cube.ts b/src/geometry/cube.ts deleted file mode 100644 index 5fac1361..00000000 --- a/src/geometry/cube.ts +++ /dev/null @@ -1,123 +0,0 @@ -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; - size: number; - constructor(center: vec3, size: number) { - super(); - this.center = vec4.fromValues(center[0], center[1], center[2], 1); - this.size = size; - } - - create() { - const halfSize = this.size / 2; - - this.positions = new Float32Array([ - // Front face - -0.5, -0.5, 0.5, 1.0, - 0.5, -0.5, 0.5, 1.0, - 0.5, 0.5, 0.5, 1.0, - -0.5, 0.5, 0.5, 1.0, - - // Back face - -0.5, -0.5, -0.5, 1.0, - 0.5, -0.5, -0.5, 1.0, - 0.5, 0.5, -0.5, 1.0, - -0.5, 0.5, -0.5, 1.0, - - // Top face - -0.5, 0.5, 0.5, 1.0, - 0.5, 0.5, 0.5, 1.0, - 0.5, 0.5, -0.5, 1.0, - -0.5, 0.5, -0.5, 1.0, - - // Bottom face - -0.5, -0.5, 0.5, 1.0, - 0.5, -0.5, 0.5, 1.0, - 0.5, -0.5, -0.5, 1.0, - -0.5, -0.5, -0.5, 1.0, - - // Right face - 0.5, -0.5, 0.5, 1.0, - 0.5, -0.5, -0.5, 1.0, - 0.5, 0.5, -0.5, 1.0, - 0.5, 0.5, 0.5, 1.0, - - // Left face - -0.5, -0.5, 0.5, 1.0, - -0.5, -0.5, -0.5, 1.0, - -0.5, 0.5, -0.5, 1.0, - -0.5, 0.5, 0.5, 1.0, - ]); - - this.normals = new Float32Array([ - // Front face normals - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - - // Back face normals - 0, 0, -1, 0, - 0, 0, -1, 0, - 0, 0, -1, 0, - 0, 0, -1, 0, - - // Top face normals - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - - // Bottom face normals - 0, -1, 0, 0, - 0, -1, 0, 0, - 0, -1, 0, 0, - 0, -1, 0, 0, - - // Right face normals - 1, 0, 0, 0, - 1, 0, 0, 0, - 1, 0, 0, 0, - 1, 0, 0, 0, - - // Left face normals - -1, 0, 0, 0, - -1, 0, 0, 0, - -1, 0, 0, 0, - -1, 0, 0, 0, - ]); - - this.indices = new Uint32Array([ - 0, 1, 2, 0, 2, 3, // Front face - 4, 5, 6, 4, 6, 7, // Back face - 8, 9, 10, 8, 10, 11, // Top face - 12, 13, 14, 12, 14, 15, // Bottom face - 16, 17, 18, 16, 18, 19, // Right face - 20, 21, 22, 20, 22, 23, // Left face - ]); - - 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; \ No newline at end of file diff --git a/src/globals.ts b/src/globals.ts deleted file mode 100644 index cac5bf28..00000000 --- a/src/globals.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export var gl: WebGL2RenderingContext; -export function setGL(_gl: WebGL2RenderingContext) { - gl = _gl; -} diff --git a/src/main.ts b/src/main.ts deleted file mode 100644 index a356f5a8..00000000 --- a/src/main.ts +++ /dev/null @@ -1,141 +0,0 @@ -import {vec3, vec4, mat4} 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 OpenGLRenderer from './rendering/gl/OpenGLRenderer'; -import Camera from './Camera'; -import {setGL} from './globals'; -import ShaderProgram, {Shader} from './rendering/gl/ShaderProgram'; - -import Cube from './geometry/cube'; - -// Define an object with application parameters and button callbacks -// This will be referred to by dat.GUI's functions that add GUI elements. -const controls = { - tesselations: 5, - 'Load Scene': loadScene, // A function pointer, essentially - color: [255.0, 0.0, 0.0], -}; - -let icosphere: Icosphere; -let square: Square; -let prevTesselations: number = 5; -let prevColor : number[] = [255.0, 0.0, 0.0]; -let cube: Cube; -let time: number = 0; - -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(); - - cube = new Cube(vec3.fromValues(0, 0, 0), 1); - cube.create(); -} - -function main() { - // 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); - - // Add controls to the gui - const gui = new DAT.GUI(); - gui.add(controls, 'tesselations', 0, 8).step(1); - gui.addColor(controls, 'color'); - gui.add(controls, 'Load Scene'); - - // get canvas and webgl context - const canvas = document.getElementById('canvas'); - const gl = canvas.getContext('webgl2'); - if (!gl) { - alert('WebGL 2 not supported!'); - } - // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module. - // Later, we can import `gl` from `globals.ts` to access it - setGL(gl); - - // Initial call to load scene - loadScene(); - - const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0)); - - const renderer = new OpenGLRenderer(canvas); - 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 custom_shader = new ShaderProgram([ - new Shader(gl.VERTEX_SHADER, require('./shaders/custom-vert.glsl')), - new Shader(gl.FRAGMENT_SHADER, require('./shaders/custom-frag.glsl')), - ]); - - - function updateColor() { - const [r, g, b] = controls.color; - //lambert.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1)); - custom_shader.setUniformVec4('u_Color',vec4.fromValues(r/255, g/255, b/255, 1)); - - } - - // This function will be called every frame - function tick() { - camera.update(); - stats.begin(); - gl.viewport(0, 0, window.innerWidth, window.innerHeight); - renderer.clear(); - - if(controls.tesselations != prevTesselations) - { - prevTesselations = controls.tesselations; - icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations); - icosphere.create(); - } - - //add time - if (controls.color != prevColor) { - prevColor = controls.color; - - updateColor(); - } - - time = time + 1; - custom_shader.setTime(time); - - renderer.render(camera, custom_shader, [ - //icosphere, - // square, - cube, - ]); - stats.end(); - - // Tell the browser to call `tick` again whenever it renders a new frame - requestAnimationFrame(tick); - } - - window.addEventListener('resize', function() { - renderer.setSize(window.innerWidth, window.innerHeight); - camera.setAspectRatio(window.innerWidth / window.innerHeight); - camera.updateProjectionMatrix(); - }, false); - - renderer.setSize(window.innerWidth, window.innerHeight); - camera.setAspectRatio(window.innerWidth / window.innerHeight); - camera.updateProjectionMatrix(); - - // Start the render loop - tick(); -} - -main(); diff --git a/src/rendering/gl/Drawable.ts b/src/rendering/gl/Drawable.ts deleted file mode 100644 index 3006b5cd..00000000 --- a/src/rendering/gl/Drawable.ts +++ /dev/null @@ -1,67 +0,0 @@ -import {gl} from '../../globals'; - -abstract class Drawable { - count: number = 0; - - 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() { - this.idxBound = true; - this.bufIdx = gl.createBuffer(); - } - - generatePos() { - this.posBound = true; - 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); - } - return this.idxBound; - } - - bindPos(): boolean { - if (this.posBound) { - gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); - } - return this.posBound; - } - - bindNor(): boolean { - if (this.norBound) { - gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); - } - return this.norBound; - } - - elemCount(): number { - return this.count; - } - - drawMode(): GLenum { - return gl.TRIANGLES; - } -}; - -export default Drawable; diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts deleted file mode 100644 index 98c7a3a8..00000000 --- a/src/rendering/gl/OpenGLRenderer.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {mat4, vec4} from 'gl-matrix'; -import Drawable from './Drawable'; -import Camera from '../../Camera'; -import {gl} from '../../globals'; -import ShaderProgram from './ShaderProgram'; - -// In this file, `gl` is accessible because it is imported above -class OpenGLRenderer { - constructor(public canvas: HTMLCanvasElement) { - } - - setClearColor(r: number, g: number, b: number, a: number) { - gl.clearColor(r, g, b, a); - } - - setSize(width: number, height: number) { - this.canvas.width = width; - this.canvas.height = height; - } - - clear() { - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - } - - 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); - } - } -}; - -export default OpenGLRenderer; diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts deleted file mode 100644 index 27680f3c..00000000 --- a/src/rendering/gl/ShaderProgram.ts +++ /dev/null @@ -1,128 +0,0 @@ -import {vec4, mat4} from 'gl-matrix'; -import Drawable from './Drawable'; -import {gl} from '../../globals'; - -var activeProgram: WebGLProgram = null; - -export class Shader { - shader: WebGLShader; - - constructor(type: number, source: string) { - this.shader = gl.createShader(type); - gl.shaderSource(this.shader, source); - gl.compileShader(this.shader); - - if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) { - throw gl.getShaderInfoLog(this.shader); - } - } -}; - -class ShaderProgram { - prog: WebGLProgram; - - attrPos: number; - attrNor: number; - attrCol: number; - //attrTime: number; - - unifModel: WebGLUniformLocation; - unifModelInvTr: WebGLUniformLocation; - unifViewProj: WebGLUniformLocation; - unifColor: WebGLUniformLocation; - unifTime: WebGLUniformLocation; - - constructor(shaders: Array) { - this.prog = gl.createProgram(); - - for (let shader of shaders) { - gl.attachShader(this.prog, shader.shader); - } - gl.linkProgram(this.prog); - if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) { - throw gl.getProgramInfoLog(this.prog); - } - - this.attrPos = gl.getAttribLocation(this.prog, "vs_Pos"); - 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"); - } - - use() { - if (activeProgram !== this.prog) { - gl.useProgram(this.prog); - activeProgram = this.prog; - } - } - - setModelMatrix(model: mat4) { - this.use(); - if (this.unifModel !== -1) { - gl.uniformMatrix4fv(this.unifModel, false, model); - } - - if (this.unifModelInvTr !== -1) { - let modelinvtr: mat4 = mat4.create(); - mat4.transpose(modelinvtr, model); - mat4.invert(modelinvtr, modelinvtr); - gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); - } - } - - setViewProjMatrix(vp: mat4) { - this.use(); - if (this.unifViewProj !== -1) { - gl.uniformMatrix4fv(this.unifViewProj, false, vp); - } - } - - setGeometryColor(color: vec4) { - this.use(); - if (this.unifColor !== -1) { - gl.uniform4fv(this.unifColor, color); - } - } - - setUniformVec4(name : string, value : vec4) - { - this.use(); - var location = gl.getUniformLocation(this.prog, name); - if (location !== -1) { - gl.uniform4fv(location, value); - } - } - - setTime(time: number) { - this.use(); - if (this.unifTime !== -1) { - gl.uniform1f(this.unifTime, time); - } - } - - draw(d: Drawable) { - this.use(); - - if (this.attrPos != -1 && d.bindPos()) { - gl.enableVertexAttribArray(this.attrPos); - 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/custom-frag.glsl b/src/shaders/custom-frag.glsl deleted file mode 100644 index b0514523..00000000 --- a/src/shaders/custom-frag.glsl +++ /dev/null @@ -1,99 +0,0 @@ -#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; - -in vec4 fs_Pos; - -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) { - return fract(sin(vec3(dot(p, vec3(127.1, 311.7, 513.3)), - dot(p, vec3(269.5, 183.3, 419.2)), - dot(p, vec3(420.6, 631.2, 937.3)) - )) * 43758.5453); -} - -float surflet(vec3 P, vec3 gridPoint) { - // Compute falloff function by converting linear distance to a polynomial - vec3 dist = abs(P - gridPoint); - vec3 t = 1.0 - 6.0 * dist * dist * dist * dist * dist - + 15.0 * dist * dist * dist * dist - - 10.0 * dist * dist * dist; - - // Get the random vector for the grid point - vec3 gradient = 2.0 * random3(gridPoint) - vec3(1.0); - - // Get the vector from the grid point to P - vec3 diff = P - gridPoint; - - // Get the value of our height field by dotting grid->P with our gradient - float height = dot(diff, gradient); - - // Scale our height field (i.e. reduce it) by our polynomial falloff function - return height * t.x * t.y * t.z; -} - -float perlinNoise(vec3 uvw) { - float surfletSum = 0.0; - - // Iterate over the eight integer corners surrounding uvw - for (int dx = 0; dx <= 1; ++dx) { - for (int dy = 0; dy <= 1; ++dy) { - for (int dz = 0; dz <= 1; ++dz) { - // Construct the grid point in 3D - vec3 gridPoint = floor(uvw) + vec3(dx, dy, dz); - - // Calculate the surflet contribution for this grid point - surfletSum += surflet(uvw, gridPoint); - } - } - } - - return surfletSum; -} - - - -void main() -{ - // Material base color (before shading) - vec4 diffuseColor = u_Color; - - float perlinValue = 1.0 - perlinNoise(vec3(fs_Pos)/0.3); - - - // 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. - - - diffuseColor *=perlinValue; - - // Compute final shaded color - out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); -} diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl deleted file mode 100644 index 132696ec..00000000 --- a/src/shaders/custom-vert.glsl +++ /dev/null @@ -1,93 +0,0 @@ -#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; - -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; - -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. - -vec2 random2( vec2 p ) { - return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), - dot(p, vec2(269.5,183.3)))) - * 43758.5453); -} - -float WorleyNoise(vec2 uv) { - uv *= 10.0; // Now the space is 10x10 instead of 1x1. Change this to any number you want. - vec2 uvInt = floor(uv); - vec2 uvFract = fract(uv); - float minDist = 1.0; // Minimum distance initialized to max. - for(int y = -1; y <= 1; ++y) { - for(int x = -1; x <= 1; ++x) { - vec2 neighbor = vec2(float(x), float(y)); // Direction in which neighbor cell lies - vec2 point = random2(uvInt + neighbor); // Get the Voronoi centerpoint for the neighboring cell - vec2 diff = neighbor + point - uvFract; // Distance between fragment coord and neighbor’s Voronoi point - float dist = length(diff); - minDist = min(minDist, dist); - } - } - return minDist; -} - - - - -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 pos = vs_Pos; - //pos += vec4( vec3(pos) + 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) +0.5 , cos(u_Time/150.0))) , 0.f); - - - vec4 modelposition = u_Model * pos; // Temporarily store the transformed vertex positions for use below - - modelposition.x += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) + modelposition.x , cos(u_Time/150.0))); - modelposition.y += 0.2 * WorleyNoise(vec2(sin(u_Time/100.0) , cos(u_Time/150.0) + modelposition.y )); - - modelposition.xyz *= 1.0 + 0.5 * sin(u_Time / 200.0); - - 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/lambert-frag.glsl b/src/shaders/lambert-frag.glsl deleted file mode 100644 index 745bc9fa..00000000 --- a/src/shaders/lambert-frag.glsl +++ /dev/null @@ -1,45 +0,0 @@ -#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 deleted file mode 100644 index 0748bacd..00000000 --- a/src/shaders/lambert-vert.glsl +++ /dev/null @@ -1,55 +0,0 @@ -#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; - -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 -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 79efea76..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./dist", - "sourceMap": true, - "noImplicitAny": true, - "module": "es6", - "target": "es6", - "allowJs": true, - "moduleResolution": "node" - } -} diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 2cce33bb..00000000 --- a/webpack.config.js +++ /dev/null @@ -1,37 +0,0 @@ -const path = require('path'); - -module.exports = { - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - entry: path.resolve(__dirname, "src/main"), - output: { - path: path.resolve(__dirname, "dist"), - filename: "bundle.js", - publicPath: '/', - }, - module: { - rules: [ - { - test: /\.ts$/, - use: 'ts-loader', - exclude: /node_modules/ - }, - { - test: /\.glsl$/, - loader: 'webpack-glsl-loader' - }, - ] - }, - resolve: { - extensions: ['.ts', '.js' ], - }, - devtool: 'source-map', - devServer: { - port: 5660, - static: { - directory: path.join(__dirname, 'dist'), - }, - client: { - overlay: true, - } - }, -};