@roomle/web-sdk 2.94.0 → 2.95.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.releaserc.json +7 -5
- package/lib/TextGeometry-259292ec.nomodule.js +2 -0
- package/lib/TextGeometry-259292ec.nomodule.js.map +1 -0
- package/lib/TextGeometry-dc304c0e.js +2 -0
- package/lib/TextGeometry-dc304c0e.js.map +1 -0
- package/lib/{banana-for-scale-1f451414.nomodule.js → banana-for-scale-71781669.nomodule.js} +2 -2
- package/lib/{banana-for-scale-1f451414.nomodule.js.map → banana-for-scale-71781669.nomodule.js.map} +1 -1
- package/lib/{banana-for-scale-8479c8a1.js → banana-for-scale-bd7ed014.js} +2 -2
- package/lib/{banana-for-scale-8479c8a1.js.map → banana-for-scale-bd7ed014.js.map} +1 -1
- package/lib/{budgeteer-measure-f6505461.js → budgeteer-measure-7662ae7e.js} +2 -2
- package/lib/{budgeteer-measure-f6505461.js.map → budgeteer-measure-7662ae7e.js.map} +1 -1
- package/lib/budgeteer-measure.nomodule.js +1 -1
- package/lib/camera-behaviour-24973bc6.js +2 -0
- package/lib/camera-behaviour-24973bc6.js.map +1 -0
- package/lib/camera-behaviour-38b2e4d9.nomodule.js +2 -0
- package/lib/camera-behaviour-38b2e4d9.nomodule.js.map +1 -0
- package/lib/component-dimensioning-4e0a7151.nomodule.js +2 -0
- package/lib/component-dimensioning-4e0a7151.nomodule.js.map +1 -0
- package/lib/component-dimensioning-9829423d.js +2 -0
- package/lib/component-dimensioning-9829423d.js.map +1 -0
- package/lib/{component-raycast-helper-163d42ba.nomodule.js → component-raycast-helper-15d24684.nomodule.js} +2 -2
- package/lib/component-raycast-helper-15d24684.nomodule.js.map +1 -0
- package/lib/{component-raycast-helper-479486e8.js → component-raycast-helper-4fdfba05.js} +2 -2
- package/lib/component-raycast-helper-4fdfba05.js.map +1 -0
- package/lib/{configurator-b5e4a5ee.nomodule.js → configurator-0d7d6a64.nomodule.js} +2 -2
- package/lib/configurator-0d7d6a64.nomodule.js.map +1 -0
- package/lib/{configurator-9333ac17.js → configurator-d59d9acf.js} +2 -2
- package/lib/configurator-d59d9acf.js.map +1 -0
- package/lib/configurator-main-23183c5c.js +2 -0
- package/lib/configurator-main-23183c5c.js.map +1 -0
- package/lib/configurator-main.nomodule.js +1 -1
- package/lib/{continuous-drawing-helper-6f2f4c78.nomodule.js → continuous-drawing-helper-0f94d7f7.nomodule.js} +2 -2
- package/lib/continuous-drawing-helper-0f94d7f7.nomodule.js.map +1 -0
- package/lib/{continuous-drawing-helper-f8a966d9.js → continuous-drawing-helper-a1262a15.js} +2 -2
- package/lib/continuous-drawing-helper-a1262a15.js.map +1 -0
- package/lib/{default-light-setting-6425c714.js → default-light-setting-20f64f6d.js} +2 -2
- package/lib/default-light-setting-20f64f6d.js.map +1 -0
- package/lib/{default-light-setting-99036b6f.nomodule.js → default-light-setting-2983998d.nomodule.js} +2 -2
- package/lib/default-light-setting-2983998d.nomodule.js.map +1 -0
- package/lib/definitions/common-core/src/cameracontrol/camera-control.d.ts +1 -0
- package/lib/definitions/common-core/src/configurator-kernel-access.d.ts +0 -1
- package/lib/definitions/common-core/src/rapi-access.d.ts +5 -1
- package/lib/definitions/common-core/src/utils/init-data.d.ts +2 -0
- package/lib/definitions/common-core/src/utils/shims.d.ts +15 -1
- package/lib/definitions/common-core/src/view-model/plan-element-view-model.d.ts +1 -1
- package/lib/definitions/common-core/src/webgl/renderer/scene-renderer.d.ts +2 -1
- package/lib/definitions/common-core/src/webgl/roomle-webgl-renderer.d.ts +1 -1
- package/lib/definitions/configurator-core/src/roomle-configurator.d.ts +9 -2
- package/lib/definitions/configurator-core/src/services/configurator-ui-callback.d.ts +2 -1
- package/lib/definitions/configurator-core/src/utils/imos-ix-poc-export-helper.d.ts +43 -0
- package/lib/definitions/configurator-core/src/utils/selection-handler.d.ts +4 -1
- package/lib/definitions/configurator-core/src/webgl/configurator-scene-event-handler.d.ts +5 -2
- package/lib/definitions/configurator-core/src/webgl/configurator-scene-manager.d.ts +3 -2
- package/lib/definitions/packages/common-core/src/cameracontrol/camera-control.d.ts +1 -0
- package/lib/definitions/packages/common-core/src/configurator-kernel-access.d.ts +0 -1
- package/lib/definitions/packages/common-core/src/rapi-access.d.ts +5 -1
- package/lib/definitions/packages/common-core/src/utils/init-data.d.ts +2 -0
- package/lib/definitions/packages/common-core/src/utils/shims.d.ts +15 -1
- package/lib/definitions/packages/common-core/src/view-model/plan-element-view-model.d.ts +1 -1
- package/lib/definitions/packages/common-core/src/webgl/renderer/scene-renderer.d.ts +2 -1
- package/lib/definitions/packages/common-core/src/webgl/roomle-webgl-renderer.d.ts +1 -1
- package/lib/definitions/packages/configurator-core/src/roomle-configurator.d.ts +9 -2
- package/lib/definitions/packages/configurator-core/src/services/configurator-ui-callback.d.ts +2 -1
- package/lib/definitions/packages/configurator-core/src/utils/imos-ix-poc-export-helper.d.ts +43 -0
- package/lib/definitions/packages/configurator-core/src/utils/selection-handler.d.ts +4 -1
- package/lib/definitions/packages/configurator-core/src/webgl/configurator-scene-event-handler.d.ts +5 -2
- package/lib/definitions/packages/configurator-core/src/webgl/configurator-scene-manager.d.ts +3 -2
- package/lib/definitions/packages/planner-core/src/camera-control/camera-control-first-person.d.ts +1 -0
- package/lib/definitions/packages/planner-core/src/external-object-api-callbacks.d.ts +26 -12
- package/lib/definitions/packages/planner-core/src/external-object-api.d.ts +10 -3
- package/lib/definitions/packages/planner-core/src/roomle-planner-ui-callback.d.ts +10 -5
- package/lib/definitions/packages/planner-core/src/roomle-planner.d.ts +63 -7
- package/lib/definitions/packages/planner-core/src/services/planner-kernel-access.d.ts +11 -11
- package/lib/definitions/packages/planner-core/src/utils/planner-scene-manager.d.ts +1 -1
- package/lib/definitions/packages/planner-core/src/view-model/plan-view-model.d.ts +8 -0
- package/lib/definitions/packages/planner-core/src/view-model/wall-attic-plan-element-view-model.d.ts +9 -0
- package/lib/definitions/packages/planner-core/src/view-model/wall-plan-element-view-model.d.ts +4 -0
- package/lib/definitions/packages/planner-core/src/webgl/planner-scene-event-handler.d.ts +1 -0
- package/lib/definitions/packages/planner-core/src/webgl/planner-scene-manager.d.ts +6 -0
- package/lib/definitions/packages/typings/kernel.d.ts +15 -0
- package/lib/definitions/packages/typings/planner.d.ts +39 -4
- package/lib/definitions/planner-core/src/camera-control/camera-control-first-person.d.ts +1 -0
- package/lib/definitions/planner-core/src/external-object-api-callbacks.d.ts +26 -12
- package/lib/definitions/planner-core/src/external-object-api.d.ts +10 -3
- package/lib/definitions/planner-core/src/roomle-planner-ui-callback.d.ts +10 -5
- package/lib/definitions/planner-core/src/roomle-planner.d.ts +63 -7
- package/lib/definitions/planner-core/src/services/planner-kernel-access.d.ts +11 -11
- package/lib/definitions/planner-core/src/utils/planner-scene-manager.d.ts +1 -1
- package/lib/definitions/planner-core/src/view-model/plan-view-model.d.ts +8 -0
- package/lib/definitions/planner-core/src/view-model/wall-attic-plan-element-view-model.d.ts +9 -0
- package/lib/definitions/planner-core/src/view-model/wall-plan-element-view-model.d.ts +4 -0
- package/lib/definitions/planner-core/src/webgl/planner-scene-event-handler.d.ts +1 -0
- package/lib/definitions/planner-core/src/webgl/planner-scene-manager.d.ts +6 -0
- package/lib/definitions/typings/kernel.d.ts +15 -0
- package/lib/definitions/typings/planner.d.ts +39 -4
- package/lib/dimensioning-helper-9d046848.nomodule.js +2 -0
- package/lib/dimensioning-helper-9d046848.nomodule.js.map +1 -0
- package/lib/dimensioning-helper-c98b39cc.js +2 -0
- package/lib/{dimensioning-helper-318b729d.js.map → dimensioning-helper-c98b39cc.js.map} +1 -1
- package/lib/{glb-viewer-66869df0.js → glb-viewer-212c78d9.js} +2 -2
- package/lib/{glb-viewer-66869df0.js.map → glb-viewer-212c78d9.js.map} +1 -1
- package/lib/{glb-viewer-2d94a287.nomodule.js → glb-viewer-a684a4c6.nomodule.js} +2 -2
- package/lib/{glb-viewer-2d94a287.nomodule.js.map → glb-viewer-a684a4c6.nomodule.js.map} +1 -1
- package/lib/{glb-viewer-camera-behaviour-169bee0e.js → glb-viewer-camera-behaviour-45c2ab16.js} +2 -2
- package/lib/glb-viewer-camera-behaviour-45c2ab16.js.map +1 -0
- package/lib/{glb-viewer-camera-behaviour-0aba3eb3.nomodule.js → glb-viewer-camera-behaviour-9754b7f1.nomodule.js} +2 -2
- package/lib/glb-viewer-camera-behaviour-9754b7f1.nomodule.js.map +1 -0
- package/lib/glb-viewer-main-ad9f4fc7.js +2 -0
- package/lib/glb-viewer-main-ad9f4fc7.js.map +1 -0
- package/lib/glb-viewer-main.nomodule.js +1 -1
- package/lib/imos-ix-poc-export-helper-6a36afe0.nomodule.js +2 -0
- package/lib/imos-ix-poc-export-helper-6a36afe0.nomodule.js.map +1 -0
- package/lib/imos-ix-poc-export-helper-9404ff2e.js +2 -0
- package/lib/imos-ix-poc-export-helper-9404ff2e.js.map +1 -0
- package/lib/legacy/TextGeometry-7a5a6f22.legacy.js +2 -0
- package/lib/legacy/TextGeometry-7a5a6f22.legacy.js.map +1 -0
- package/lib/legacy/{banana-for-scale-a28854f7.legacy.js → banana-for-scale-063481d1.legacy.js} +2 -2
- package/lib/legacy/{banana-for-scale-a28854f7.legacy.js.map → banana-for-scale-063481d1.legacy.js.map} +1 -1
- package/lib/legacy/budgeteer-measure.legacy.js +1 -1
- package/lib/legacy/camera-behaviour-c9de2cca.legacy.js +2 -0
- package/lib/legacy/camera-behaviour-c9de2cca.legacy.js.map +1 -0
- package/lib/legacy/component-dimensioning-bdada177.legacy.js +2 -0
- package/lib/legacy/component-dimensioning-bdada177.legacy.js.map +1 -0
- package/lib/legacy/{component-raycast-helper-17b7f665.legacy.js → component-raycast-helper-9add4bb8.legacy.js} +2 -2
- package/lib/legacy/component-raycast-helper-9add4bb8.legacy.js.map +1 -0
- package/lib/legacy/{configurator-c69e87db.legacy.js → configurator-a0fc9e2b.legacy.js} +2 -2
- package/lib/legacy/configurator-a0fc9e2b.legacy.js.map +1 -0
- package/lib/legacy/configurator-main.legacy.js +1 -1
- package/lib/legacy/{continuous-drawing-helper-bb050ff2.legacy.js → continuous-drawing-helper-def6a16b.legacy.js} +2 -2
- package/lib/legacy/continuous-drawing-helper-def6a16b.legacy.js.map +1 -0
- package/lib/legacy/{default-light-setting-086a7648.legacy.js → default-light-setting-0867c2ad.legacy.js} +2 -2
- package/lib/legacy/default-light-setting-0867c2ad.legacy.js.map +1 -0
- package/lib/legacy/dimensioning-helper-6a8cddd0.legacy.js +2 -0
- package/lib/legacy/dimensioning-helper-6a8cddd0.legacy.js.map +1 -0
- package/lib/legacy/{glb-viewer-4a69cf11.legacy.js → glb-viewer-110cb6c4.legacy.js} +2 -2
- package/lib/legacy/{glb-viewer-4a69cf11.legacy.js.map → glb-viewer-110cb6c4.legacy.js.map} +1 -1
- package/lib/legacy/{glb-viewer-camera-behaviour-a0bd3636.legacy.js → glb-viewer-camera-behaviour-f6168432.legacy.js} +2 -2
- package/lib/legacy/glb-viewer-camera-behaviour-f6168432.legacy.js.map +1 -0
- package/lib/legacy/glb-viewer-main.legacy.js +1 -1
- package/lib/legacy/imos-ix-poc-export-helper-fdfedc90.legacy.js +2 -0
- package/lib/legacy/imos-ix-poc-export-helper-fdfedc90.legacy.js.map +1 -0
- package/lib/legacy/main-thread-to-worker-6115d235.legacy.js +7 -0
- package/lib/legacy/main-thread-to-worker-6115d235.legacy.js.map +1 -0
- package/lib/legacy/{material-viewer-aec0f3b7.legacy.js → material-viewer-b67b9c39.legacy.js} +2 -2
- package/lib/legacy/material-viewer-b67b9c39.legacy.js.map +1 -0
- package/lib/legacy/material-viewer-main.legacy.js +1 -1
- package/lib/legacy/planner-9f484212.legacy.js +2 -0
- package/lib/legacy/planner-9f484212.legacy.js.map +1 -0
- package/lib/legacy/planner-main.legacy.js +1 -1
- package/lib/legacy/{query-params-helper-aca6a1b1.legacy.js → query-params-helper-28b451be.legacy.js} +2 -2
- package/lib/legacy/query-params-helper-28b451be.legacy.js.map +1 -0
- package/lib/legacy/roomle-configurator-de101c34.legacy.js +2 -0
- package/lib/legacy/roomle-configurator-de101c34.legacy.js.map +1 -0
- package/lib/legacy/roomle-dependency-injection-6f2ea0b0.legacy.js +9 -0
- package/lib/legacy/roomle-dependency-injection-6f2ea0b0.legacy.js.map +1 -0
- package/lib/legacy/roomle-sdk.legacy.js +1 -1
- package/lib/legacy/{script-loader-d6b10e8e.legacy.js → script-loader-813426c5.legacy.js} +2 -2
- package/lib/legacy/script-loader-813426c5.legacy.js.map +1 -0
- package/lib/legacy/static/ConfiguratorKernel-224f3e49bcca1cee.wasm +0 -0
- package/lib/legacy/static/{ConfiguratorKernel-2ddc08f9542fc91f.js → ConfiguratorKernel-f5baba2ad8da5981.js} +3 -3
- package/lib/legacy/static/{RoomleCore-f2d7b1b87640ef15.js → RoomleCore-df3ed2b0c7211584.js} +50 -50
- package/lib/legacy/static/RoomleCore-f35e0972ad5263e7.wasm +0 -0
- package/lib/legacy/static/RoomleToolsCore-c263aadc8e58a52f.wasm +0 -0
- package/lib/legacy/static/default-external-object-api-configuration-c4294f96099e0d09.json +70 -0
- package/lib/legacy/{stats-helper-4d796606.legacy.js → stats-helper-df7e9281.legacy.js} +2 -2
- package/lib/legacy/stats-helper-df7e9281.legacy.js.map +1 -0
- package/lib/legacy/{tools-core-15dc1d58.legacy.js → tools-core-0de78af1.legacy.js} +2 -2
- package/lib/legacy/tools-core-0de78af1.legacy.js.map +1 -0
- package/lib/main-thread-to-worker-352ff4b1.js +8 -0
- package/lib/main-thread-to-worker-352ff4b1.js.map +1 -0
- package/lib/main-thread-to-worker-7f1cb5ea.nomodule.js +8 -0
- package/lib/main-thread-to-worker-7f1cb5ea.nomodule.js.map +1 -0
- package/lib/{material-viewer-2c8625ff.nomodule.js → material-viewer-17245c14.nomodule.js} +2 -2
- package/lib/material-viewer-17245c14.nomodule.js.map +1 -0
- package/lib/{material-viewer-c9197111.js → material-viewer-21b41edc.js} +2 -2
- package/lib/material-viewer-21b41edc.js.map +1 -0
- package/lib/material-viewer-main-7a85fb66.js +2 -0
- package/lib/material-viewer-main-7a85fb66.js.map +1 -0
- package/lib/material-viewer-main.nomodule.js +1 -1
- package/lib/planner-0f75d071.nomodule.js +2 -0
- package/lib/planner-0f75d071.nomodule.js.map +1 -0
- package/lib/planner-2a7134a5.js +2 -0
- package/lib/planner-2a7134a5.js.map +1 -0
- package/lib/planner-main-49e474c0.js +2 -0
- package/lib/planner-main-49e474c0.js.map +1 -0
- package/lib/planner-main.nomodule.js +1 -1
- package/lib/{query-params-helper-c9492f35.js → query-params-helper-28405b8d.js} +2 -2
- package/lib/query-params-helper-28405b8d.js.map +1 -0
- package/lib/{query-params-helper-51a53f8c.nomodule.js → query-params-helper-4f855064.nomodule.js} +2 -2
- package/lib/query-params-helper-4f855064.nomodule.js.map +1 -0
- package/lib/roomle-configurator-0efacaed.nomodule.js +2 -0
- package/lib/roomle-configurator-0efacaed.nomodule.js.map +1 -0
- package/lib/roomle-configurator-c663d225.js +2 -0
- package/lib/roomle-configurator-c663d225.js.map +1 -0
- package/lib/roomle-dependency-injection-2c9062d2.js +9 -0
- package/lib/roomle-dependency-injection-2c9062d2.js.map +1 -0
- package/lib/roomle-dependency-injection-7065f121.nomodule.js +9 -0
- package/lib/roomle-dependency-injection-7065f121.nomodule.js.map +1 -0
- package/lib/{roomle-sdk-6ccf3ded.js → roomle-sdk-05836f4b.js} +2 -2
- package/lib/roomle-sdk-05836f4b.js.map +1 -0
- package/lib/roomle-sdk.nomodule.js +1 -1
- package/lib/{script-loader-8964e022.js → script-loader-7e3054f7.js} +2 -2
- package/lib/script-loader-7e3054f7.js.map +1 -0
- package/lib/{script-loader-b4e814f2.nomodule.js → script-loader-d022ac10.nomodule.js} +2 -2
- package/lib/script-loader-d022ac10.nomodule.js.map +1 -0
- package/lib/static/ConfiguratorKernel-224f3e49bcca1cee.wasm +0 -0
- package/lib/static/{ConfiguratorKernel-2ddc08f9542fc91f.js → ConfiguratorKernel-f5baba2ad8da5981.js} +1 -1
- package/lib/static/{ConfiguratorKernel-2ddc08f9542fc91f.js.map → ConfiguratorKernel-f5baba2ad8da5981.js.map} +1 -1
- package/lib/static/RoomleCore-df3ed2b0c7211584.js +1 -0
- package/lib/static/RoomleCore-df3ed2b0c7211584.js.map +1 -0
- package/lib/static/RoomleCore-f35e0972ad5263e7.wasm +0 -0
- package/lib/static/RoomleToolsCore-c263aadc8e58a52f.wasm +0 -0
- package/lib/static/default-external-object-api-configuration-c4294f96099e0d09.json +70 -0
- package/lib/{stats-helper-510ddd65.js → stats-helper-35f4c9ae.js} +2 -2
- package/lib/stats-helper-35f4c9ae.js.map +1 -0
- package/lib/{stats-helper-86728f77.nomodule.js → stats-helper-76e1b50a.nomodule.js} +2 -2
- package/lib/stats-helper-76e1b50a.nomodule.js.map +1 -0
- package/lib/{tools-core-0f3ae134.nomodule.js → tools-core-027637cd.nomodule.js} +2 -2
- package/lib/tools-core-027637cd.nomodule.js.map +1 -0
- package/lib/{tools-core-bae4492f.js → tools-core-3bdc826b.js} +2 -2
- package/lib/tools-core-3bdc826b.js.map +1 -0
- package/package.json +3 -3
- package/lib/TextGeometry-ab643210.js +0 -2
- package/lib/TextGeometry-ab643210.js.map +0 -1
- package/lib/TextGeometry-cd81779b.nomodule.js +0 -2
- package/lib/TextGeometry-cd81779b.nomodule.js.map +0 -1
- package/lib/camera-behaviour-27b6ce79.nomodule.js +0 -2
- package/lib/camera-behaviour-27b6ce79.nomodule.js.map +0 -1
- package/lib/camera-behaviour-b9a52002.js +0 -2
- package/lib/camera-behaviour-b9a52002.js.map +0 -1
- package/lib/component-dimensioning-9cc86304.nomodule.js +0 -2
- package/lib/component-dimensioning-9cc86304.nomodule.js.map +0 -1
- package/lib/component-dimensioning-aa4cd8f4.js +0 -2
- package/lib/component-dimensioning-aa4cd8f4.js.map +0 -1
- package/lib/component-raycast-helper-163d42ba.nomodule.js.map +0 -1
- package/lib/component-raycast-helper-479486e8.js.map +0 -1
- package/lib/configurator-9333ac17.js.map +0 -1
- package/lib/configurator-b5e4a5ee.nomodule.js.map +0 -1
- package/lib/configurator-main-d0382ff8.js +0 -2
- package/lib/configurator-main-d0382ff8.js.map +0 -1
- package/lib/continuous-drawing-helper-6f2f4c78.nomodule.js.map +0 -1
- package/lib/continuous-drawing-helper-f8a966d9.js.map +0 -1
- package/lib/default-light-setting-6425c714.js.map +0 -1
- package/lib/default-light-setting-99036b6f.nomodule.js.map +0 -1
- package/lib/dimensioning-helper-318b729d.js +0 -2
- package/lib/dimensioning-helper-49404687.nomodule.js +0 -2
- package/lib/dimensioning-helper-49404687.nomodule.js.map +0 -1
- package/lib/glb-viewer-camera-behaviour-0aba3eb3.nomodule.js.map +0 -1
- package/lib/glb-viewer-camera-behaviour-169bee0e.js.map +0 -1
- package/lib/glb-viewer-main-1b2e5764.js +0 -2
- package/lib/glb-viewer-main-1b2e5764.js.map +0 -1
- package/lib/legacy/TextGeometry-f4299b59.legacy.js +0 -2
- package/lib/legacy/TextGeometry-f4299b59.legacy.js.map +0 -1
- package/lib/legacy/camera-behaviour-e6ce4b6d.legacy.js +0 -2
- package/lib/legacy/camera-behaviour-e6ce4b6d.legacy.js.map +0 -1
- package/lib/legacy/component-dimensioning-a3182494.legacy.js +0 -2
- package/lib/legacy/component-dimensioning-a3182494.legacy.js.map +0 -1
- package/lib/legacy/component-raycast-helper-17b7f665.legacy.js.map +0 -1
- package/lib/legacy/configurator-c69e87db.legacy.js.map +0 -1
- package/lib/legacy/continuous-drawing-helper-bb050ff2.legacy.js.map +0 -1
- package/lib/legacy/default-light-setting-086a7648.legacy.js.map +0 -1
- package/lib/legacy/dimensioning-helper-fb07be35.legacy.js +0 -2
- package/lib/legacy/dimensioning-helper-fb07be35.legacy.js.map +0 -1
- package/lib/legacy/glb-viewer-camera-behaviour-a0bd3636.legacy.js.map +0 -1
- package/lib/legacy/main-thread-to-worker-7c2b8bc9.legacy.js +0 -7
- package/lib/legacy/main-thread-to-worker-7c2b8bc9.legacy.js.map +0 -1
- package/lib/legacy/material-viewer-aec0f3b7.legacy.js.map +0 -1
- package/lib/legacy/planner-2bc74cf2.legacy.js +0 -2
- package/lib/legacy/planner-2bc74cf2.legacy.js.map +0 -1
- package/lib/legacy/query-params-helper-aca6a1b1.legacy.js.map +0 -1
- package/lib/legacy/roomle-configurator-d5ea14c2.legacy.js +0 -2
- package/lib/legacy/roomle-configurator-d5ea14c2.legacy.js.map +0 -1
- package/lib/legacy/roomle-dependency-injection-500dbf0d.legacy.js +0 -9
- package/lib/legacy/roomle-dependency-injection-500dbf0d.legacy.js.map +0 -1
- package/lib/legacy/script-loader-d6b10e8e.legacy.js.map +0 -1
- package/lib/legacy/static/ConfiguratorKernel-793e445c9d64ee4b.wasm +0 -0
- package/lib/legacy/static/RoomleCore-7d39e007d6f9b788.wasm +0 -0
- package/lib/legacy/static/RoomleToolsCore-9c348432c6d79392.wasm +0 -0
- package/lib/legacy/static/default-external-object-api-configuration-1e7103889f664a3f.json +0 -16
- package/lib/legacy/stats-helper-4d796606.legacy.js.map +0 -1
- package/lib/legacy/tools-core-15dc1d58.legacy.js.map +0 -1
- package/lib/main-thread-to-worker-2529fa31.nomodule.js +0 -2
- package/lib/main-thread-to-worker-2529fa31.nomodule.js.map +0 -1
- package/lib/main-thread-to-worker-ee3036b3.js +0 -2
- package/lib/main-thread-to-worker-ee3036b3.js.map +0 -1
- package/lib/material-viewer-2c8625ff.nomodule.js.map +0 -1
- package/lib/material-viewer-c9197111.js.map +0 -1
- package/lib/material-viewer-main-8787208d.js +0 -2
- package/lib/material-viewer-main-8787208d.js.map +0 -1
- package/lib/planner-5fb6f448.js +0 -2
- package/lib/planner-5fb6f448.js.map +0 -1
- package/lib/planner-65127889.nomodule.js +0 -2
- package/lib/planner-65127889.nomodule.js.map +0 -1
- package/lib/planner-main-d8ae156a.js +0 -2
- package/lib/planner-main-d8ae156a.js.map +0 -1
- package/lib/query-params-helper-51a53f8c.nomodule.js.map +0 -1
- package/lib/query-params-helper-c9492f35.js.map +0 -1
- package/lib/roomle-configurator-9fe534c7.js +0 -2
- package/lib/roomle-configurator-9fe534c7.js.map +0 -1
- package/lib/roomle-configurator-ebb94f0f.nomodule.js +0 -2
- package/lib/roomle-configurator-ebb94f0f.nomodule.js.map +0 -1
- package/lib/roomle-dependency-injection-4e221caa.js +0 -9
- package/lib/roomle-dependency-injection-4e221caa.js.map +0 -1
- package/lib/roomle-dependency-injection-5fd128b0.nomodule.js +0 -9
- package/lib/roomle-dependency-injection-5fd128b0.nomodule.js.map +0 -1
- package/lib/roomle-sdk-6ccf3ded.js.map +0 -1
- package/lib/script-loader-8964e022.js.map +0 -1
- package/lib/script-loader-b4e814f2.nomodule.js.map +0 -1
- package/lib/static/ConfiguratorKernel-793e445c9d64ee4b.wasm +0 -0
- package/lib/static/RoomleCore-7d39e007d6f9b788.wasm +0 -0
- package/lib/static/RoomleCore-f2d7b1b87640ef15.js +0 -1
- package/lib/static/RoomleCore-f2d7b1b87640ef15.js.map +0 -1
- package/lib/static/RoomleToolsCore-9c348432c6d79392.wasm +0 -0
- package/lib/static/default-external-object-api-configuration-1e7103889f664a3f.json +0 -16
- package/lib/stats-helper-510ddd65.js.map +0 -1
- package/lib/stats-helper-86728f77.nomodule.js.map +0 -1
- package/lib/tools-core-0f3ae134.nomodule.js.map +0 -1
- package/lib/tools-core-bae4492f.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roomle-dependency-injection-2c9062d2.js","sources":["../../packages/common-core/public/predefined_lightsettings/shelf.json","../../packages/common-core/public/predefined_lightsettings/shelf_front.json","../../packages/common-core/public/predefined_lightsettings/sofa.json","../../packages/common-core/public/predefined_lightsettings/baked.json","../../packages/common-core/public/predefined_lightsettings/camera.json","../../packages/common-core/public/predefined_lightsettings/equal.json","../../packages/workers/generated/asset-loader.worker.js","../../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../../node_modules/three/examples/jsm/libs/draco/draco_wasm_wrapper.js","../../node_modules/three/examples/jsm/libs/draco/draco_decoder.wasm","../../node_modules/three/examples/jsm/libs/draco/draco_decoder.js","../../node_modules/dat.gui/build/dat.gui.module.js","../../packages/common-core/public/textures/env/default_256.exr","../../node_modules/three/examples/jsm/postprocessing/Pass.js","../../node_modules/three/examples/jsm/math/SimplexNoise.js","../../node_modules/three/examples/jsm/loaders/FontLoader.js","../../packages/configurator-core/public/fonts/lato_regular.json","../../node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm","../../node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.js","../../node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm","../../node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js","../../packages/configurator-core/public/settings/default-external-object-api-configuration.json","../../node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm","../../node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.js","../../node_modules/three/examples/jsm/libs/fflate.module.js","../../node_modules/three/examples/jsm/loaders/EXRLoader.js","../../node_modules/three/examples/jsm/loaders/RGBELoader.js","../../node_modules/three/examples/jsm/helpers/RectAreaLightHelper.js","../../node_modules/three/examples/jsm/shaders/CopyShader.js","../../node_modules/three/examples/jsm/shaders/FXAAShader.js"],"sourcesContent":["export default \"static/shelf-2975dd3f2fa9c763.json\"","export default \"static/shelf_front-8c9566a4512f0de8.json\"","export default \"static/sofa-997b116bc5f2e92e.json\"","export default \"static/baked-6485a2b1daeb69e8.json\"","export default \"static/camera-05824b47cdb951e4.json\"","export default \"static/equal-319f6b83c827913f.json\"","export default \"static/asset-loader.worker-1735a5fb1e401244.js\"","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute} attribute\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n *\n * @param {Object<String, Material>} cache\n * @return {Material}\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t *\n\t * @param {Object} cache\n\t * @param {Object3D} index\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/**\n\t * Returns a reference to a shared resource, cloning it if necessary.\n\t *\n\t * @param {Object} cache\n\t * @param {Number} index\n\t * @param {Object} object\n\t * @return {Object}\n\t */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t *\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @param {string} colorSpace\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * When Object3D instances are targeted by animation, they need unique names.\n\t *\n\t * @param {String} originalName\n\t * @return {String}\n\t */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tColorManagement,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i );\n\t\t\tColorManagement.toWorkingColorSpace( _color, SRGBColorSpace );\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","export default \"static/draco_wasm_wrapper-6263f3a4b71cdf3b.js\"","export default \"static/draco_decoder-b048235474cbf09e.wasm\"","export default \"static/draco_decoder-dc7f397e2a2ebac4.js\"","/**\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 = \"<div id=\\\"dg-save\\\" class=\\\"dg dialogue\\\">\\n\\n Here's the new load parameter for your <code>GUI</code>'s constructor:\\n\\n <textarea id=\\\"dg-new-constructor\\\"></textarea>\\n\\n <div id=\\\"dg-save-locally\\\">\\n\\n <input id=\\\"dg-local-storage\\\" type=\\\"checkbox\\\"/> Automatically save\\n values to <code>localStorage</code> on exit.\\n\\n <div id=\\\"dg-local-explain\\\">The values saved to <code>localStorage</code> will\\n override those passed to <code>dat.GUI</code>'s constructor. This makes it\\n easier to work incrementally, but <code>localStorage</code> is fragile,\\n and your friends may not see the same values you do.\\n\\n </div>\\n\\n </div>\\n\\n</div>\";\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","export default \"static/default_256-f1c66a2764f88cc0.exr\"","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","// Ported from Stefan Gustavson's java implementation\n// http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n// Read Stefan's excellent paper for details on how this code works.\n//\n// Sean McCullough banksean@gmail.com\n//\n// Added 4D noise\n\n/**\n * You can pass in a random number generator object if you like.\n * It is assumed to have a random() method.\n */\nclass SimplexNoise {\n\n\tconstructor( r = Math ) {\n\n\t\tthis.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],\n\t\t\t[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],\n\t\t\t[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];\n\n\t\tthis.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],\n\t\t\t[ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],\n\t\t\t[ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],\n\t\t\t[ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],\n\t\t\t[ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],\n\t\t\t[ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],\n\t\t\t[ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],\n\t\t\t[ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];\n\n\t\tthis.p = [];\n\n\t\tfor ( let i = 0; i < 256; i ++ ) {\n\n\t\t\tthis.p[ i ] = Math.floor( r.random() * 256 );\n\n\t\t}\n\n\t\t// To remove the need for index wrapping, double the permutation table length\n\t\tthis.perm = [];\n\n\t\tfor ( let i = 0; i < 512; i ++ ) {\n\n\t\t\tthis.perm[ i ] = this.p[ i & 255 ];\n\n\t\t}\n\n\t\t// A lookup table to traverse the simplex around a given point in 4D.\n\t\t// Details can be found where this table is used, in the 4D noise method.\n\t\tthis.simplex = [\n\t\t\t[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],\n\t\t\t[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],\n\t\t\t[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],\n\t\t\t[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];\n\n\t}\n\n\tdot( g, x, y ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y;\n\n\t}\n\n\tdot3( g, x, y, z ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;\n\n\t}\n\n\tdot4( g, x, y, z, w ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;\n\n\t}\n\n\tnoise( xin, yin ) {\n\n\t\tlet n0; // Noise contributions from the three corners\n\t\tlet n1;\n\t\tlet n2;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );\n\t\tconst s = ( xin + yin ) * F2; // Hairy factor for 2D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;\n\t\tconst t = ( i + j ) * G2;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y) space\n\t\tconst Y0 = j - t;\n\t\tconst x0 = xin - X0; // The x,y distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\n\t\t// For the 2D case, the simplex shape is an equilateral triangle.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second (middle) corner of simplex in (i,j) coords\n\n\t\tlet j1;\n\t\tif ( x0 > y0 ) {\n\n\t\t\ti1 = 1; j1 = 0;\n\n\t\t\t// lower triangle, XY order: (0,0)->(1,0)->(1,1)\n\n\t\t}\telse {\n\n\t\t\ti1 = 0; j1 = 1;\n\n\t\t} // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n\n\t\t// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n\t\t// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n\t\t// c = (3-sqrt(3))/6\n\t\tconst x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n\t\tconst y1 = y0 - j1 + G2;\n\t\tconst x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n\t\tconst y2 = y0 - 1.0 + 2.0 * G2;\n\t\t// Work out the hashed gradient indices of the three simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;\n\t\t// Calculate the contribution from the three corners\n\t\tlet t0 = 0.5 - x0 * x0 - y0 * y0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient\n\n\t\t}\n\n\t\tlet t1 = 0.5 - x1 * x1 - y1 * y1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );\n\n\t\t}\n\n\t\tlet t2 = 0.5 - x2 * x2 - y2 * y2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to return values in the interval [-1,1].\n\t\treturn 70.0 * ( n0 + n1 + n2 );\n\n\t}\n\n\t// 3D simplex noise\n\tnoise3d( xin, yin, zin ) {\n\n\t\tlet n0; // Noise contributions from the four corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F3 = 1.0 / 3.0;\n\t\tconst s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst k = Math.floor( zin + s );\n\t\tconst G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too\n\t\tconst t = ( i + j + k ) * G3;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst x0 = xin - X0; // The x,y,z distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\t\tconst z0 = zin - Z0;\n\n\t\t// For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second corner of simplex in (i,j,k) coords\n\n\t\tlet j1;\n\t\tlet k1;\n\t\tlet i2; // Offsets for third corner of simplex in (i,j,k) coords\n\t\tlet j2;\n\t\tlet k2;\n\t\tif ( x0 >= y0 ) {\n\n\t\t\tif ( y0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t\t// X Y Z order\n\n\t\t\t} else if ( x0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t\t// X Z Y order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t} // Z X Y order\n\n\t\t} else { // x0<y0\n\n\t\t\tif ( y0 < z0 ) {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;\n\n\t\t\t\t// Z Y X order\n\n\t\t\t} else if ( x0 < z0 ) {\n\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;\n\n\t\t\t\t// Y Z X order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t} // Y X Z order\n\n\t\t}\n\n\t\t// A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n\t\t// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n\t\t// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n\t\t// c = 1/6.\n\t\tconst x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n\t\tconst y1 = y0 - j1 + G3;\n\t\tconst z1 = z0 - k1 + G3;\n\t\tconst x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G3;\n\t\tconst z2 = z0 - k2 + 2.0 * G3;\n\t\tconst x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords\n\t\tconst y3 = y0 - 1.0 + 3.0 * G3;\n\t\tconst z3 = z0 - 1.0 + 3.0 * G3;\n\t\t// Work out the hashed gradient indices of the four simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;\n\t\tconst gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12;\n\t\t// Calculate the contribution from the four corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot3( this.grad3[ gi0 ], x0, y0, z0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot3( this.grad3[ gi1 ], x1, y1, z1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot3( this.grad3[ gi2 ], x2, y2, z2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this.dot3( this.grad3[ gi3 ], x3, y3, z3 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to stay just inside [-1,1]\n\t\treturn 32.0 * ( n0 + n1 + n2 + n3 );\n\n\t}\n\n\t// 4D simplex noise\n\tnoise4d( x, y, z, w ) {\n\n\t\t// For faster and easier lookups\n\t\tconst grad4 = this.grad4;\n\t\tconst simplex = this.simplex;\n\t\tconst perm = this.perm;\n\n\t\t// The skewing and unskewing factors are hairy again for the 4D case\n\t\tconst F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;\n\t\tconst G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;\n\t\tlet n0; // Noise contributions from the five corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\tlet n4;\n\t\t// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n\t\tconst s = ( x + y + z + w ) * F4; // Factor for 4D skewing\n\t\tconst i = Math.floor( x + s );\n\t\tconst j = Math.floor( y + s );\n\t\tconst k = Math.floor( z + s );\n\t\tconst l = Math.floor( w + s );\n\t\tconst t = ( i + j + k + l ) * G4; // Factor for 4D unskewing\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst W0 = l - t;\n\t\tconst x0 = x - X0; // The x,y,z,w distances from the cell origin\n\t\tconst y0 = y - Y0;\n\t\tconst z0 = z - Z0;\n\t\tconst w0 = w - W0;\n\n\t\t// For the 4D case, the simplex is a 4D shape I won't even try to describe.\n\t\t// To find out which of the 24 possible simplices we're in, we need to\n\t\t// determine the magnitude ordering of x0, y0, z0 and w0.\n\t\t// The method below is a good way of finding the ordering of x,y,z,w and\n\t\t// then find the correct traversal order for the simplex we’re in.\n\t\t// First, six pair-wise comparisons are performed between each possible pair\n\t\t// of the four coordinates, and the results are used to add up binary bits\n\t\t// for an integer index.\n\t\tconst c1 = ( x0 > y0 ) ? 32 : 0;\n\t\tconst c2 = ( x0 > z0 ) ? 16 : 0;\n\t\tconst c3 = ( y0 > z0 ) ? 8 : 0;\n\t\tconst c4 = ( x0 > w0 ) ? 4 : 0;\n\t\tconst c5 = ( y0 > w0 ) ? 2 : 0;\n\t\tconst c6 = ( z0 > w0 ) ? 1 : 0;\n\t\tconst c = c1 + c2 + c3 + c4 + c5 + c6;\n\n\t\t// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n\t\t// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n\t\t// impossible. Only the 24 indices which have non-zero entries make any sense.\n\t\t// We use a thresholding to set the coordinates in turn from the largest magnitude.\n\t\t// The number 3 in the \"simplex\" array is at the position of the largest coordinate.\n\t\tconst i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;\n\t\tconst j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;\n\t\tconst k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;\n\t\tconst l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;\n\t\t// The number 2 in the \"simplex\" array is at the second largest coordinate.\n\t\tconst i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;\n\t\tconst j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;\n\t\tconst k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;\n\t\tconst l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;\n\t\t// The number 1 in the \"simplex\" array is at the second smallest coordinate.\n\t\tconst i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;\n\t\tconst j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;\n\t\tconst k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;\n\t\tconst l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;\n\t\t// The fifth corner has all coordinate offsets = 1, so no need to look that up.\n\t\tconst x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n\t\tconst y1 = y0 - j1 + G4;\n\t\tconst z1 = z0 - k1 + G4;\n\t\tconst w1 = w0 - l1 + G4;\n\t\tconst x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G4;\n\t\tconst z2 = z0 - k2 + 2.0 * G4;\n\t\tconst w2 = w0 - l2 + 2.0 * G4;\n\t\tconst x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n\t\tconst y3 = y0 - j3 + 3.0 * G4;\n\t\tconst z3 = z0 - k3 + 3.0 * G4;\n\t\tconst w3 = w0 - l3 + 3.0 * G4;\n\t\tconst x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n\t\tconst y4 = y0 - 1.0 + 4.0 * G4;\n\t\tconst z4 = z0 - 1.0 + 4.0 * G4;\n\t\tconst w4 = w0 - 1.0 + 4.0 * G4;\n\t\t// Work out the hashed gradient indices of the five simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst ll = l & 255;\n\t\tconst gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;\n\t\tconst gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;\n\t\tconst gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;\n\t\tconst gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;\n\t\tconst gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;\n\t\t// Calculate the contribution from the five corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );\n\n\t\t}\n\n\t\tlet t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n\t\tif ( t4 < 0 ) n4 = 0.0;\n\t\telse {\n\n\t\t\tt4 *= t4;\n\t\t\tn4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );\n\n\t\t}\n\n\t\t// Sum up and scale the result to cover the range [-1,1]\n\t\treturn 27.0 * ( n0 + n1 + n2 + n3 + n4 );\n\n\t}\n\n}\n\nexport { SimplexNoise };\n","import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\nclass FontLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tconst font = scope.parse( JSON.parse( text ) );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n//\n\nclass Font {\n\n\tconstructor( data ) {\n\n\t\tthis.isFont = true;\n\n\t\tthis.type = 'Font';\n\n\t\tthis.data = data;\n\n\t}\n\n\tgenerateShapes( text, size = 100 ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tshapes.push( ...paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nexport { FontLoader, Font };\n","export default \"static/lato_regular-16ba9d6f2866947d.json\"","export default \"static/ConfiguratorKernel-224f3e49bcca1cee.wasm\"","export default \"static/ConfiguratorKernel-f5baba2ad8da5981.js\"","export default \"static/RoomleCore-f35e0972ad5263e7.wasm\"","export default \"static/RoomleCore-df3ed2b0c7211584.js\"","export default \"static/default-external-object-api-configuration-c4294f96099e0d09.json\"","export default \"static/RoomleToolsCore-c263aadc8e58a52f.wasm\"","export default \"static/RoomleToolsCore-5dffa0f3345223bd.js\"","/*!\nfflate - fast JavaScript compression/decompression\n<https://101arrowz.github.io/fflate>\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.8.2\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data.length) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush();\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function () { w.postMessage([]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n */\n Deflate.prototype.flush = function () {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n */\n Gzip.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n // process concatenated GZIP\n if (this.s.f && !this.s.l && !final) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n */\n Zlib.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearSRGBColorSpace,\n\tRedFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n * implementation, so I have preserved their copyright notices.\n */\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of the Syoyo Fujita nor the\n// names of its contributors may be used to endorse or promote products\n// derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // * Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // * Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // * Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\nclass EXRLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], true );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.columns * info.lines * ( info.inputChannels.length * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.inputChannels.length );\n\t\t\tfor ( let i = 0, il = info.inputChannels.length; i < il; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.columns;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.inputChannels.length; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.inputChannels.length; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\n\t\t\tconst byteSize = info.inputChannels.length * info.lines * info.columns * info.totalBytes;\n\t\t\tconst tmpBuffer = new ArrayBuffer( byteSize );\n\t\t\tconst viewer = new DataView( tmpBuffer );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.inputChannels.length; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tconst type = info.inputChannels[ c ].pixelType;\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.columns;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.columns;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.columns; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\tviewer.setUint16( writePtr, pixel, true );\n\t\t\t\t\t\t\t\twritePtr += 2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.columns;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.columns;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.columns;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.columns; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\tviewer.setUint32( writePtr, pixel, true );\n\t\t\t\t\t\t\t\twritePtr += 4;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn viewer;\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.columns * info.lines * ( info.inputChannels.length * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.inputChannels.length );\n\n\t\t\tfor ( let i = 0; i < info.inputChannels.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.columns;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.inputChannels.length; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Lossy DCT decode RGB channels\n\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseInt32( dataView, offset );\n\t\t\tconst yMin = parseInt32( dataView, offset );\n\t\t\tconst xMax = parseInt32( dataView, offset );\n\t\t\tconst yMax = parseInt32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y',\n\t\t\t\t'DECREASING_Y',\n\t\t\t\t'RANDOM_Y',\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseEnvmap( dataView, offset ) {\n\n\t\t\tconst envmaps = [\n\t\t\t\t'ENVMAP_LATLONG',\n\t\t\t\t'ENVMAP_CUBE'\n\t\t\t];\n\n\t\t\tconst envmap = parseUint8( dataView, offset );\n\n\t\t\treturn envmaps[ envmap ];\n\n\t\t}\n\n\t\tfunction parseTiledesc( dataView, offset ) {\n\n\t\t\tconst levelModes = [\n\t\t\t\t'ONE_LEVEL',\n\t\t\t\t'MIPMAP_LEVELS',\n\t\t\t\t'RIPMAP_LEVELS',\n\t\t\t];\n\n\t\t\tconst roundingModes = [\n\t\t\t\t'ROUND_DOWN',\n\t\t\t\t'ROUND_UP',\n\t\t\t];\n\n\t\t\tconst xSize = parseUint32( dataView, offset );\n\t\t\tconst ySize = parseUint32( dataView, offset );\n\t\t\tconst modes = parseUint8( dataView, offset );\n\n\t\t\treturn {\n\t\t\t\txSize: xSize,\n\t\t\t\tySize: ySize,\n\t\t\t\tlevelMode: levelModes[ modes & 0xf ],\n\t\t\t\troundingMode: roundingModes[ modes >> 4 ]\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'envmap' ) {\n\n\t\t\t\treturn parseEnvmap( dataView, offset );\n\n\t\t\t} else if ( type === 'tiledesc' ) {\n\n\t\t\t\treturn parseTiledesc( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction roundLog2( x, mode ) {\n\n\t\t\tconst log2 = Math.log2( x );\n\t\t\treturn mode == 'ROUND_DOWN' ? Math.floor( log2 ) : Math.ceil( log2 );\n\n\t\t}\n\n\t\tfunction calculateTileLevels( tiledesc, w, h ) {\n\n\t\t\tlet num = 0;\n\n\t\t\tswitch ( tiledesc.levelMode ) {\n\n\t\t\t\tcase 'ONE_LEVEL':\n\t\t\t\t\tnum = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MIPMAP_LEVELS':\n\t\t\t\t\tnum = roundLog2( Math.max( w, h ), tiledesc.roundingMode ) + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RIPMAP_LEVELS':\n\t\t\t\t\tthrow new Error( 'THREE.EXRLoader: RIPMAP_LEVELS tiles currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn num;\n\n\t\t}\n\n\t\tfunction calculateTiles( count, dataSize, size, roundingMode ) {\n\n\t\t\tconst tiles = new Array( count );\n\n\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\tconst b = ( 1 << i );\n\t\t\t\tlet s = ( dataSize / b ) | 0;\n\n\t\t\t\tif ( roundingMode == 'ROUND_UP' && s * b < dataSize ) s += 1;\n\n\t\t\t\tconst l = Math.max( s, 1 );\n\n\t\t\t\ttiles[ i ] = ( ( l + size - 1 ) / size ) | 0;\n\n\t\t\t}\n\n\t\t\treturn tiles;\n\n\t\t}\n\n\t\tfunction parseTiles() {\n\n\t\t\tconst EXRDecoder = this;\n\t\t\tconst offset = EXRDecoder.offset;\n\t\t\tconst tmpOffset = { value: 0 };\n\n\t\t\tfor ( let tile = 0; tile < EXRDecoder.tileCount; tile ++ ) {\n\n\t\t\t\tconst tileX = parseInt32( EXRDecoder.viewer, offset );\n\t\t\t\tconst tileY = parseInt32( EXRDecoder.viewer, offset );\n\t\t\t\toffset.value += 8; // skip levels - only parsing top-level\n\t\t\t\tEXRDecoder.size = parseUint32( EXRDecoder.viewer, offset );\n\n\t\t\t\tconst startX = tileX * EXRDecoder.blockWidth;\n\t\t\t\tconst startY = tileY * EXRDecoder.blockHeight;\n\t\t\t\tEXRDecoder.columns = ( startX + EXRDecoder.blockWidth > EXRDecoder.width ) ? EXRDecoder.width - startX : EXRDecoder.blockWidth;\n\t\t\t\tEXRDecoder.lines = ( startY + EXRDecoder.blockHeight > EXRDecoder.height ) ? EXRDecoder.height - startY : EXRDecoder.blockHeight;\n\n\t\t\t\tconst bytesBlockLine = EXRDecoder.columns * EXRDecoder.totalBytes;\n\t\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * bytesBlockLine;\n\t\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\t\tfor ( let line = 0; line < EXRDecoder.lines; line ++ ) {\n\n\t\t\t\t\tconst lineOffset = line * EXRDecoder.columns * EXRDecoder.totalBytes;\n\n\t\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.inputChannels.length; channelID ++ ) {\n\n\t\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\t\tconst lOff = EXRDecoder.channelByteOffsets[ name ] * EXRDecoder.columns;\n\t\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\t\t\t\t\t\tconst outLineOffset = ( EXRDecoder.height - ( 1 + startY + line ) ) * EXRDecoder.outLineWidth;\n\n\t\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.columns; x ++ ) {\n\n\t\t\t\t\t\t\tconst outIndex = outLineOffset + ( x + startX ) * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseScanline() {\n\n\t\t\tconst EXRDecoder = this;\n\t\t\tconst offset = EXRDecoder.offset;\n\t\t\tconst tmpOffset = { value: 0 };\n\n\t\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.blockHeight; scanlineBlockIdx ++ ) {\n\n\t\t\t\tconst line = parseInt32( EXRDecoder.viewer, offset ) - EXRHeader.dataWindow.yMin; // line_no\n\t\t\t\tEXRDecoder.size = parseUint32( EXRDecoder.viewer, offset ); // data_len\n\t\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.blockHeight > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.blockHeight );\n\n\t\t\t\tconst bytesPerLine = EXRDecoder.columns * EXRDecoder.totalBytes;\n\t\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * bytesPerLine;\n\t\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.blockHeight; line_y ++ ) {\n\n\t\t\t\t\tconst scan_y = scanlineBlockIdx * EXRDecoder.blockHeight;\n\t\t\t\t\tconst true_y = line_y + EXRDecoder.scanOrder( scan_y );\n\t\t\t\t\tif ( true_y >= EXRDecoder.height ) continue;\n\n\t\t\t\t\tconst lineOffset = line_y * bytesPerLine;\n\t\t\t\t\tconst outLineOffset = ( EXRDecoder.height - 1 - true_y ) * EXRDecoder.outLineWidth;\n\n\t\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.inputChannels.length; channelID ++ ) {\n\n\t\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\t\tconst lOff = EXRDecoder.channelByteOffsets[ name ] * EXRDecoder.columns;\n\t\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\n\t\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.columns; x ++ ) {\n\n\t\t\t\t\t\t\tconst outIndex = outLineOffset + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName == 0 ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `THREE.EXRLoader: Skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( spec & ~ 0x06 ) != 0 ) { // unsupported deep-image, multi-part\n\n\t\t\t\tconsole.error( 'THREE.EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tinputChannels: EXRHeader.channels,\n\t\t\t\tchannelByteOffsets: {},\n\t\t\t\tscanOrder: null,\n\t\t\t\ttotalBytes: null,\n\t\t\t\tcolumns: null,\n\t\t\t\tlines: null,\n\t\t\t\ttype: null,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tconst channels = {};\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tswitch ( channel.name ) {\n\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\tcase 'R':\n\t\t\t\t\tcase 'G':\n\t\t\t\t\tcase 'B':\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tchannels[ channel.name ] = true;\n\t\t\t\t\t\tEXRDecoder.type = channel.pixelType;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tlet fillAlpha = false;\n\n\t\t\tif ( channels.R && channels.G && channels.B ) {\n\n\t\t\t\tfillAlpha = ! channels.A;\n\t\t\t\tEXRDecoder.outputChannels = 4;\n\t\t\t\tEXRDecoder.decodeChannels = { R: 0, G: 1, B: 2, A: 3 };\n\n\t\t\t} else if ( channels.Y ) {\n\n\t\t\t\tEXRDecoder.outputChannels = 1;\n\t\t\t\tEXRDecoder.decodeChannels = { Y: 0 };\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: file contains unsupported data channels.' );\n\n\t\t\t}\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.columns = EXRDecoder.width;\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlet byteOffset = 0;\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tif ( EXRDecoder.decodeChannels[ channel.name ] !== undefined ) {\n\n\t\t\t\t\tEXRDecoder.channelByteOffsets[ channel.name ] = byteOffset;\n\n\t\t\t\t}\n\n\t\t\t\tbyteOffset += channel.pixelType * 2;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.totalBytes = byteOffset;\n\t\t\tEXRDecoder.outLineWidth = EXRDecoder.width * EXRDecoder.outputChannels;\n\n\t\t\tif ( EXRHeader.lineOrder === 'INCREASING_Y' ) {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => y;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => EXRDecoder.height - 1 - y;\n\n\t\t\t}\n\n\t\t\tif ( EXRDecoder.outputChannels == 4 ) {\n\n\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\tEXRDecoder.colorSpace = NoColorSpace;\n\n\t\t\t}\n\n\t\t\tif ( EXRHeader.spec.singleTile ) {\n\n\t\t\t\tEXRDecoder.blockHeight = EXRHeader.tiles.ySize;\n\t\t\t\tEXRDecoder.blockWidth = EXRHeader.tiles.xSize;\n\n\t\t\t\tconst numXLevels = calculateTileLevels( EXRHeader.tiles, EXRDecoder.width, EXRDecoder.height );\n\t\t\t\t// const numYLevels = calculateTileLevels( EXRHeader.tiles, EXRDecoder.width, EXRDecoder.height );\n\n\t\t\t\tconst numXTiles = calculateTiles( numXLevels, EXRDecoder.width, EXRHeader.tiles.xSize, EXRHeader.tiles.roundingMode );\n\t\t\t\tconst numYTiles = calculateTiles( numXLevels, EXRDecoder.height, EXRHeader.tiles.ySize, EXRHeader.tiles.roundingMode );\n\n\t\t\t\tEXRDecoder.tileCount = numXTiles[ 0 ] * numYTiles[ 0 ];\n\n\t\t\t\tfor ( let l = 0; l < numXLevels; l ++ )\n\t\t\t\t\tfor ( let y = 0; y < numYTiles[ l ]; y ++ )\n\t\t\t\t\t\tfor ( let x = 0; x < numXTiles[ l ]; x ++ )\n\t\t\t\t\t\t\tparseInt64( dataView, offset ); // tileOffset\n\n\t\t\t\tEXRDecoder.decode = parseTiles.bind( EXRDecoder );\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.blockWidth = EXRDecoder.width;\n\t\t\t\tconst blockCount = Math.ceil( EXRDecoder.height / EXRDecoder.blockHeight );\n\n\t\t\t\tfor ( let i = 0; i < blockCount; i ++ )\n\t\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t\tEXRDecoder.decode = parseScanline.bind( EXRDecoder );\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\t\tconst offset = { value: 0 };\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );\n\n\t\t// parse input data\n\t\tEXRDecoder.decode();\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tcolorSpace: EXRDecoder.colorSpace,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.colorSpace = texData.colorSpace;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\trgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tconst w = rgbe_header_info.width,\n\t\t\th = rgbe_header_info.height,\n\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\n\t\tlet data, type;\n\t\tlet numElements;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = floatArray;\n\t\t\t\ttype = FloatType;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = halfArray;\n\t\t\t\ttype = HalfFloatType;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthrow new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: w, height: h,\n\t\t\tdata: data,\n\t\t\theader: rgbe_header_info.string,\n\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\texposure: rgbe_header_info.exposure,\n\t\t\ttype: type\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","import {\n\tBackSide,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMesh,\n\tMeshBasicMaterial\n} from 'three';\n\n/**\n * This helper must be added as a child of the light\n */\n\nclass RectAreaLightHelper extends Line {\n\n\tconstructor( light, color ) {\n\n\t\tconst positions = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineBasicMaterial( { fog: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\t\tthis.color = color; // optional hardwired color for the helper\n\t\tthis.type = 'RectAreaLightHelper';\n\n\t\t//\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { side: BackSide, fog: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld() {\n\n\t\tthis.scale.set( 0.5 * this.light.width, 0.5 * this.light.height, 1 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\t\t\tthis.children[ 0 ].material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// prevent hue shift\n\t\t\tconst c = this.material.color;\n\t\t\tconst max = Math.max( c.r, c.g, c.b );\n\t\t\tif ( max > 1 ) c.multiplyScalar( 1 / max );\n\n\t\t\tthis.children[ 0 ].material.color.copy( this.material.color );\n\n\t\t}\n\n\t\t// ignore world scale on light\n\t\tthis.matrixWorld.extractRotation( this.light.matrixWorld ).scale( this.scale ).copyPosition( this.light.matrixWorld );\n\n\t\tthis.children[ 0 ].matrixWorld.copy( this.matrixWorld );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nexport { RectAreaLightHelper };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tVector2\n} from 'three';\n\nconst FXAAShader = {\n\n\tname: 'FXAAShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t// FXAA algorithm from NVIDIA, C# implementation by Jasper Flick, GLSL port by Dave Hoskins\n\t\t// http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf\n\t\t// https://catlikecoding.com/unity/tutorials/advanced-rendering/fxaa/\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv, 0.0, 1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv, 1.0, 0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv, 0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0, 0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv, 1.0, 1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0, 1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv, 1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\t\t\t\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\t\t\t\n\t\t}`\n\n};\n\nexport { FXAAShader };\n"],"names":["mergeGeometries","geometries","useGroups","isIndexed","index","attributesUsed","Set","Object","keys","attributes","morphAttributesUsed","morphAttributes","morphTargetsRelative","mergedGeometry","BufferGeometry","offset","i","length","geometry","attributesCount","console","error","name","has","undefined","push","size","count","position","addGroup","indexOffset","mergedIndex","j","getX","setIndex","mergedAttribute","mergeAttributes","setAttribute","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","TypedArray","itemSize","normalized","gpuType","arrayLength","attribute","array","constructor","result","BufferAttribute","isInterleavedBufferAttribute","tupleOffset","l","c","value","getComponent","setComponent","set","toTrianglesDrawMode","drawMode","TrianglesDrawMode","warn","TriangleFanDrawMode","TriangleStripDrawMode","getIndex","indices","getAttribute","numberOfTriangles","newIndices","newGeometry","clone","clearGroups","GLTFLoader","Loader","[object Object]","manager","super","this","dracoLoader","ktx2Loader","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","url","onLoad","onProgress","onError","scope","resourcePath","path","relativeUrl","LoaderUtils","extractUrlBase","resolveURL","itemStart","_onError","e","itemError","itemEnd","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","load","data","parse","gltf","callback","indexOf","splice","json","extensions","plugins","textDecoder","TextDecoder","JSON","ArrayBuffer","decode","Uint8Array","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","content","asset","version","Error","GLTFParser","crossOrigin","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","Promise","resolve","reject","GLTFRegistry","objects","get","key","add","object","remove","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_DISPERSION","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_ANISOTROPY","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_MATERIALS_BUMP","EXT_TEXTURE_WEBP","EXT_TEXTURE_AVIF","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","cache","refs","uses","nodeDefs","nodes","nodeIndex","nodeLength","nodeDef","light","_addNodeRef","lightIndex","cacheKey","dependency","lightDef","lights","lightNode","color","Color","setRGB","LinearSRGBColorSpace","range","type","DirectionalLight","target","PointLight","distance","SpotLight","spot","innerConeAngle","outerConeAngle","Math","PI","angle","penumbra","assignExtrasToUserData","intensity","createUniqueName","_loadLight","self","then","_getNodeRef","MeshBasicMaterial","materialParams","materialDef","pending","opacity","metallicRoughness","pbrMetallicRoughness","Array","isArray","baseColorFactor","baseColorTexture","assignTexture","SRGBColorSpace","all","materialIndex","materials","emissiveStrength","emissiveIntensity","MeshPhysicalMaterial","extension","clearcoatFactor","clearcoat","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughness","clearcoatRoughnessTexture","clearcoatNormalTexture","scale","clearcoatNormalScale","Vector2","dispersion","iridescenceFactor","iridescence","iridescenceTexture","iridescenceIor","iridescenceIOR","iridescenceThicknessRange","iridescenceThicknessMinimum","iridescenceThicknessMaximum","iridescenceThicknessTexture","sheenColor","sheenRoughness","sheen","sheenColorFactor","colorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmission","transmissionTexture","thickness","thicknessFactor","thicknessTexture","attenuationDistance","Infinity","colorArray","attenuationColor","ior","specularIntensity","specularFactor","specularTexture","specularColorFactor","specularColor","specularColorTexture","bumpScale","bumpFactor","bumpTexture","anisotropyStrength","anisotropy","anisotropyRotation","anisotropyTexture","textureIndex","textureDef","textures","options","loadTextureImage","source","isSupported","images","textureLoader","uri","handler","getHandler","detectSupport","loadTexture","image","Image","src","onload","onerror","height","bufferView","bufferViews","extensionDef","buffer","getDependency","decoder","supported","res","byteOffset","byteLength","stride","byteStride","decodeGltfBufferAsync","mode","filter","ready","decodeGltfBuffer","mesh","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","accessor","createNodeMesh","results","nodeObject","pop","isGroup","children","instancedMeshes","m","Matrix4","p","Vector3","q","Quaternion","s","instancedMesh","InstancedMesh","material","TRANSLATION","fromBufferAttribute","ROTATION","SCALE","setMatrixAt","compose","attributeName","attr","instanceColor","InstancedBufferAttribute","Object3D","prototype","copy","call","assignFinalMaterial","clear","body","headerView","DataView","header","magic","slice","getUint32","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","toLowerCase","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","decodeDracoFile","texture","transform","texCoord","channel","rotation","fromArray","repeat","needsUpdate","GLTFCubicSplineInterpolant","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","values","valueSize","i1","t0","t","t1","stride2","stride3","td","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","_q","GLTFCubicSplineQuaternionInterpolant","interpolate_","normalize","toArray","FLOAT","FLOAT_MAT3","FLOAT_MAT4","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","LINEAR","REPEAT","SAMPLER_2D","POINTS","LINES","LINE_LOOP","LINE_STRIP","UNSIGNED_BYTE","UNSIGNED_SHORT","5120","Int8Array","5121","5122","Int16Array","5123","Uint16Array","5125","Uint32Array","5126","Float32Array","WEBGL_FILTERS","9728","NearestFilter","9729","LinearFilter","9984","NearestMipmapNearestFilter","9985","LinearMipmapNearestFilter","9986","NearestMipmapLinearFilter","9987","LinearMipmapLinearFilter","WEBGL_WRAPPINGS","33071","ClampToEdgeWrapping","33648","MirroredRepeatWrapping","10497","RepeatWrapping","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","TEXCOORD_3","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","InterpolateLinear","STEP","InterpolateDiscrete","addUnknownExtensionsToUserData","knownExtensions","objectDef","userData","gltfExtensions","gltfDef","extras","assign","updateMorphTargets","il","morphTargetInfluences","targetNames","morphTargetDictionary","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","targets","attributesKey","sort","getNormalizedComponentScale","_identityMatrix","associations","Map","primitiveCache","nodeCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","safariVersion","isFirefox","firefoxVersion","navigator","userAgent","test","safariMatch","match","parseInt","createImageBitmap","TextureLoader","ImageBitmapLoader","setCrossOrigin","_invokeAll","ext","_markDefs","beforeRoot","getDependencies","dependencies","scene","scenes","animations","cameras","afterRoot","updateMatrixWorld","catch","skinDefs","skins","meshDefs","skinIndex","skinLength","joints","isBone","skin","isSkinnedMesh","camera","ref","updateMappings","original","mappings","child","entries","func","unshift","loadScene","_invokeOne","loadNode","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","map","def","bufferIndex","bufferDef","buffers","bufferViewDef","accessorIndex","sparse","pendingBufferViews","elementBytes","BYTES_PER_ELEMENT","itemBytes","bufferAttribute","ibSlice","floor","ibCacheKey","ib","InterleavedBuffer","InterleavedBufferAttribute","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","setX","setY","setZ","setW","sourceIndex","sourceDef","sampler","promise","loadImageSource","flipY","startsWith","samplers","magFilter","minFilter","wrapS","wrapT","generateMipmaps","isCompressedTexture","URL","webkitURL","sourceURI","isObjectURL","blob","Blob","mimeType","createObjectURL","isImageBitmapLoader","imageBitmap","Texture","revokeObjectURL","search","mapName","mapDef","colorSpace","gltfReference","extendTexture","useDerivativeTangents","tangent","useVertexColors","useFlatShading","normal","isPoints","uuid","pointsMaterial","PointsMaterial","Material","sizeAttenuation","isLine","lineMaterial","LineBasicMaterial","cachedMaterial","vertexColors","flatShading","normalScale","y","MeshStandardMaterial","materialType","kmuExtension","getMaterialType","extendParams","metalness","metallicFactor","roughness","roughnessFactor","metallicRoughnessTexture","extendMaterialParams","doubleSided","side","DoubleSide","alphaMode","transparent","depthWrite","alphaTest","alphaCutoff","normalTexture","occlusionTexture","strength","aoMapIntensity","emissiveFactor","emissive","emissiveTexture","originalName","sanitizedName","PropertyBinding","sanitizeNodeName","createDracoPrimitive","decodePrimitive","addPrimitiveAttributes","cached","geometryPromise","meshIndex","depthTest","FrontSide","loadGeometries","SkinnedMesh","Mesh","normalizeSkinWeights","LineSegments","Line","LineLoop","Points","group","Group","cameraIndex","cameraDef","params","PerspectiveCamera","MathUtils","radToDeg","yfov","aspectRatio","znear","zfar","OrthographicCamera","xmag","ymag","skinDef","_loadNodeShallow","inverseBindMatrices","jointNodes","bones","boneInverses","jointNode","mat","Skeleton","animationIndex","animationDef","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","node","input","parameters","output","inputAccessors","outputAccessors","tracks","inputAccessor","outputAccessor","updateMatrix","createdTracks","_createAnimationTracks","k","AnimationClip","traverse","o","isMesh","nodePending","childPending","childrenDef","skeletonPending","skeleton","bind","nodeName","meshPromise","createNodeAttachment","forEach","Bone","matrix","applyMatrix4","quaternion","sceneIndex","sceneDef","nodeIds","reducedAssociations","reduceAssociations","targetName","TypedKeyframeTrack","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","interpolation","outputArray","_getArrayFromAccessor","jl","track","_createCubicSplineTrackInterpolant","scaled","createInterpolant","times","getValueSize","isInterpolantFactoryMethodGLTFCubicSpline","assignAttributeAccessor","gltfAttributeName","ColorManagement","workingColorSpace","box","Box3","min","max","boxScale","multiplyScalar","maxDisplacement","vector","abs","expandByVector","boundingBox","sphere","Sphere","getCenter","center","radius","distanceTo","boundingSphere","computeBounds","hasMorphPosition","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","morphNormals","morphColors","addMorphTargets","_taskCache","WeakMap","DRACOLoader","decoderPath","decoderConfig","decoderBinary","decoderPending","workerLimit","workerPool","workerNextTaskID","workerSourceURL","defaultAttributeIDs","uv","defaultAttributeTypes","config","attributeIDs","attributeTypes","vertexColorSpace","taskConfig","useUniqueIDs","decodeGeometry","taskKey","stringify","cachedTask","worker","taskID","taskCost","geometryPending","_getWorker","_worker","_callbacks","postMessage","id","message","_createGeometry","_releaseTask","geometryData","_assignVertexColorSpace","inputColorSpace","_color","toWorkingColorSpace","setXYZ","r","g","b","responseType","_initDecoder","useJS","WebAssembly","librariesPending","_loadLibrary","libraries","jsContent","wasmBinary","fn","DRACOWorker","toString","substring","lastIndexOf","join","Worker","_taskCosts","_taskLoad","onmessage","a","terminate","decodeAttribute","draco","dracoGeometry","attributeType","numComponents","num_components","numValues","num_points","dataType","DT_FLOAT32","DT_INT8","DT_INT16","Int32Array","DT_INT32","DT_UINT8","DT_UINT16","DT_UINT32","getDracoDataType","ptr","_malloc","GetAttributeDataArrayForAllPoints","HEAPF32","_free","onModuleLoaded","DracoDecoderModule","module","Decoder","decodingStatus","geometryType","GetEncodedGeometryType","TRIANGULAR_MESH","DecodeArrayToMesh","POINT_CLOUD","PointCloud","DecodeArrayToPointCloud","ok","error_msg","attributeID","GetAttributeByUniqueId","GetAttributeId","GetAttribute","attributeResult","numIndices","num_faces","GetTrianglesUInt32Array","decodeIndex","destroy","colorToString","forceCSSHex","colorFormat","__state","conversionName","round","h","toFixed","v","str","hex","ARR_EACH","ARR_SLICE","Common","BREAK","extend","each","arguments","obj","isObject","isUndefined","defaults","toCall","args","apply","itr","_key","defer","fnc","setTimeout","debounce","threshold","callImmediately","timeout","delayed","callNow","clearTimeout","isNull","isNaN","_isNaN","_x","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","space","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","f","rgb_to_hsv","delta","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","property","receiver","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","ReferenceError","defineRGBComponent","component","componentHexIndex","recalculateRGB","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","left","right","top","bottom","fakeEvent","eventType","pars","aux","className","evt","createEvent","clientX","x","clientY","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","unbind","removeEventListener","detachEvent","addClass","classes","split","replace","removeClass","removeAttribute","hasClass","RegExp","getWidth","getComputedStyle","width","getHeight","getOffset","el","offsetParent","offsetLeft","offsetTop","isActive","activeElement","href","BooleanController","_Controller","_this2","_this","__prev","__checkbox","setValue","appendChild","checked","OptionController","opts","__select","element","opt","innerHTML","desiredValue","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","_NumberController","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","decimals","tenTo","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","getBoundingClientRect","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","display","cursor","background","linearGradient","cssText","outline","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","saveDialogContents","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","WebkitTransition","transition","hide","webkitTransform","layout","innerWidth","innerHeight","cssContent","indoc","doc","injected","head","getElementsByTagName","css","___$insertStyle","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","preset","scrollable","root","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","gui","__preset_select","setPresetSelectIndex","revert","setWidth","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","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","_nextSibling","_name","firstElementChild","listen","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","augmentController","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","__save_row","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","newConstructorTextArea","which","show","focus","save","presetName","prompt","saveAs","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","w","getCurrentPreset","useInitialValues","savedValues","toggleHide","CLASS_TOO_TALL","_keydownHandler","addColor","removeChild","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","offsetHeight","remember","updateDisplays","controllerArray","GUI$1","ENV_HDR_256_FILE_NAME","_camera","_geometry","Float32BufferAttribute","FullScreenQuad","_mesh","dispose","renderer","render","SimplexNoise","grad3","grad4","random","perm","simplex","z","xin","yin","n0","n1","n2","sqrt","G2","x0","y0","j1","x1","y1","x2","y2","ii","jj","gi0","gi1","gi2","dot","t2","zin","n3","z0","k1","j2","k2","z1","z2","x3","y3","z3","kk","gi3","dot3","t3","F4","G4","n4","w0","l1","l2","i3","j3","k3","l3","w1","w2","w3","x4","y4","z4","w4","ll","gi4","dot4","t4","FontLoader","font","Font","isFont","shapes","paths","chars","from","resolution","line_height","yMax","yMin","underlineThickness","offsetX","offsetY","char","ret","createPath","createPaths","pl","toShapes","glyph","glyphs","familyName","ShapePath","cpx","cpy","cpx1","cpy1","cpx2","cpy2","_cachedOutline","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","ha","u8","u16","i32","fleb","fdeb","clim","freb","eb","start","_a","fl","revfl","fd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","flrm","fdrm","bits","d","bits16","ec","err","ind","msg","nt","code","captureStackTrace","et","unzlibSync","dat","st","buf","dict","sl","dl","noBuf","resize","noSt","cbuf","bl","nbuf","final","pos","bt","lm","dm","lbt","dbt","n","tbts","subarray","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lt","dt","lms","dms","lpos","sym","dsym","end","shift","dend","slc","inflt","dictionary","out","stream","EXRLoader","DataTextureLoader","HalfFloatType","logBase","getBitsReturn","lc","getBits","nBits","uInt8Array","inOffset","parseUint8Array","hufTableBuffer","hufLength","hufCode","getCharReturn","getChar","getCodeReturn","getCode","po","rlc","outBuffer","outBufferOffset","outBufferEndOffset","cs","UInt16","Int16","wdec14Return","wdec14","ls","hs","ai","as","bs","wdec16","bb","aa","wav2Decode","nx","ox","ny","oy","mx","w14","p2","py","ey","oy1","oy2","ox1","ox2","i00","i01","i10","i11","px","ex","p01","p10","p11","hufUncompress","inDataView","nCompressed","nRaw","initialInOffset","im","parseUint32","iM","freq","hdec","len","lit","hufClearDecTable","ni","hcode","zerun","nc","hufCanonicalCodeTable","hufUnpackEncTable","hdecod","plOffset","hufBuildDecTable","encodingTable","decodingTable","no","outOffset","inOffsetEnd","trunc","HUF_DECSIZE","hufDecode","predictor","interleaveScalar","stop","decodeRunLength","reader","getInt8","getUint8","unRleAC","currAcComp","acBuffer","halfZigBlock","acValue","dctComp","dctInverse","cos","alpha","beta","theta","gamma","row","rowPtr","column","csc709Inverse","cb","cr","convertToHalf","dst","idx","DataUtils","toHalfFloat","float","sign","uncompressRAW","info","uncompressRLE","compressed","viewer","rawBuffer","tmpBuffer","uncompressZIP","fflate.unzlibSync","uncompressPIZ","columns","lines","inputChannels","bitmap","outBufferEnd","pizChannelData","minNonZero","parseUint16","maxNonZero","parseUint8","lut","reverseLutFromBitmap","nData","applyLut","tmpOffset","cp","uncompressPXR","byteSize","totalBytes","tmpBufferEnd","writePtr","pixel","pixelType","setUint16","setUint32","uncompressDWA","dwaHeader","parseInt64","unknownUncompressedSize","unknownCompressedSize","acCompressedSize","dcCompressedSize","rleCompressedSize","rleUncompressedSize","rleRawSize","totalAcUncompressedCount","totalDcUncompressedCount","acCompression","EXRHeader","compression","channelRules","ruleSize","parseNullTerminatedString","channelData","decoded","pLinear","cscSet","rule","dcBuffer","rleBuffer","zlibInfo","rowOffsets","chan","rowPtrs","dataView","numFullBlocksX","numBlocksX","ceil","numBlocksY","leftoverX","leftoverY","currDcComp","dctData","rowBlock","comp","blocky","maxY","maxX","blockx","fill","decodeFloat16","halfRow","getUint16","setFloat32","lossyDctDecode","rleOffset","rowOffsetBytes","byte","uintBuffer","endOffset","stringValue","parseInt32","Int32","getInt32","Uint32","Uint8","int","Number","getBigInt64","parseFloat32","getFloat32","decodeFloat32","binary","exponent","fraction","Uint16","parseFloat16","parseValue","parseFixedLengthString","startOffset","xSampling","ySampling","parseChlist","redX","redY","greenX","greenY","blueX","blueY","whiteX","whiteY","parseChromaticities","parseCompression","xMin","xMax","parseBox2i","parseEnvmap","xSize","ySize","modes","levelMode","roundingMode","parseTiledesc","parseLineOrder","parseV2f","parseV3f","parseRational","parseTimecode","calculateTiles","dataSize","tiles","parseTiles","EXRDecoder","tile","tileCount","tileX","tileY","startX","blockWidth","startY","blockHeight","bytesBlockLine","uncompress","line","lineOffset","channelID","lOff","channelByteOffsets","cOff","decodeChannels","outLineOffset","outLineWidth","outIndex","outputChannels","byteArray","parseScanline","scanlineBlockIdx","dataWindow","bytesPerLine","line_y","scan_y","true_y","scanOrder","bufferDataView","spec","singleTile","longName","deepFormat","multiPart","keepReading","attributeValue","parseHeader","outputType","format","fillAlpha","R","G","B","A","Y","FloatType","lineOrder","RGBAFormat","RedFormat","NoColorSpace","numXLevels","tiledesc","num","log2","roundLog2","calculateTileLevels","numXTiles","numYTiles","blockCount","setupDecoder","texData","RGBELoader","rgbe_error","rgbe_error_code","fgets","lineLimit","consume","chunk","String","fromCharCode","RGBEByteToRGBFloat","sourceArray","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","rgbe_header_info","gamma_re","exposure_re","format_re","dimensions_re","valid","string","comments","programtype","exposure","charAt","RGBE_ReadHeader","image_rgba_data","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","isEncodedRun","byteValue","off","RGBE_ReadPixels_RLE","numElements","floatArray","halfArray","isPass","enabled","needsSwap","renderToScreen","RectAreaLightHelper","computeBoundingSphere","fog","geometry2","BackSide","matrixWorld","extractRotation","copyPosition","CopyShader","uniforms","tDiffuse","vertexShader","fragmentShader","FXAAShader"],"mappings":"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AAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAEhC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAEhC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAEhC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAEhC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KAChC26C,EAAK,IAAOsF,EAAejgD,EAAK,KA5M7B85C,EAAY2F,EAASE,IAMrBpF,EAAekF,GAIhB,IAAM,IAAIE,EAAO,EAAGA,EA7DN,IA6DyBA,EAEtCjF,EAAe+E,EAASE,GAAQD,EAAUC,GAAiB,GAATI,GAMpD,IAAIpzD,EAAS,EAEb,IAAM,IAAIgzD,EAAO,EAAGA,EAvEL,IAuEwBA,EAAO,CAE7C,MAAMvmD,EAAOklD,EAAaG,EAAO7D,IAAK+E,IAASvmD,KAE/C,IAAM,IAAIie,EAAI,EAAIuoC,EAAQvoC,EAAI,EAAIuoC,EAASC,IAASxoC,EAAI,CAEvD1qB,EAASmyD,EAAYa,GAAQtoC,GAE7B,IAAM,IAAI0oC,EAAS,EAAGA,EAASb,IAAmBa,EAAS,CAE1D,MAAM//C,EAAe,GAAT+/C,EAA8B,GAAR,EAAJ1oC,GAE9B4nC,EAAS/B,UAAWvwD,EAAS,EAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GACjFi/C,EAAS/B,UAAWvwD,EAAS,EAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GACjFi/C,EAAS/B,UAAWvwD,EAAS,EAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GACjFi/C,EAAS/B,UAAWvwD,EAAS,EAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GAEjFi/C,EAAS/B,UAAWvwD,EAAS,EAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GACjFi/C,EAAS/B,UAAWvwD,EAAS,GAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GACjFi/C,EAAS/B,UAAWvwD,EAAS,GAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GACjFi/C,EAAS/B,UAAWvwD,EAAS,GAAiByM,EAAMsmD,EAAUC,GAAQ3/C,EAAM,IAAK,GAEjFrT,GAAU,GAAiByM,GAO7B,GAAK8lD,GAAkBC,EAEtB,IAAM,IAAI9nC,EAAI,EAAIuoC,EAAQvoC,EAAI,EAAIuoC,EAASC,IAASxoC,EAAI,CAEvD,MAAM1qB,EAASmyD,EAAYa,GAAQtoC,GAAM,EAAI6nC,EA5zB/B,EA4zB6D9lD,EACrE4G,EAAuB,GAAjBk/C,EAAsC,GAAR,EAAJ7nC,GAEtC,IAAM,IAAIyb,EAAI,EAAGA,EAAIgtB,IAAShtB,EAE7BmsB,EAAS/B,UAAWvwD,EAj0BP,EAi0BgBmmC,EAAiB15B,EAAMsmD,EAAUC,GAAQ3/C,EAAM8yB,IAAK,KA2EvF,IAAmB9yB,EAAK26C,EA/DvB,MAAMuF,EAAU,IAAIz2C,YAAayrB,GACjC+pB,EAAW,IAAI96C,SAAUywC,EAAUr0C,QAGnC,IAAM,IAAIo/C,EAAO,EAAGA,EA7HJ,IA6HuBA,EAAO,CAE7CrB,EAAaG,EAAO7D,IAAK+E,IAASpB,SAAU,EAC5C,MAAMnlD,EAAOklD,EAAaG,EAAO7D,IAAK+E,IAASvmD,KAE/C,GAAiC,GAA5BklD,EAAaqB,GAAOvmD,KAEzB,IAAM,IAAIie,EAAI,EAAGA,EAAIlX,IAAWkX,EAAI,CAEnC,MAAM1qB,EAASmyD,EAAYa,GAAQtoC,GAEnC,IAAM,IAAIyb,EAAI,EAAGA,EAAIoC,IAAUpC,EAE9BotB,EAASptB,GAAMmsB,EAASkB,UAAWxzD,EA91BpB,EA81B6BmmC,EAAiB15B,GAAM,GAIpE,IAAM,IAAI05B,EAAI,EAAGA,EAAIoC,IAAUpC,EAE9BmsB,EAASmB,WAAYzzD,EAp2BN,EAo2BemmC,EAAiB15B,EAAM6mD,EAAeC,EAASptB,KAAO,KA+mBvFutB,CAAgB5B,EAAQK,EAAYR,EAAa5E,EAAUiF,EAAU/J,GAGrE,IAAM,IAAIhoD,EAAI,EAAGA,EAAI0xD,EAAYzxD,SAAWD,EAAI,CAE/C,MAAMwiD,EAAKkP,EAAa1xD,GAExB,IAAKwiD,EAAGmP,QAER,OAASnP,EAAG8O,aAEX,KAt9CS,EAw9CR,IAAI9D,EAAM,EACNkG,EAAY,EAEhB,IAAM,IAAIjpC,EAAI,EAAGA,EAAI6jC,EAAKU,QAAUvkC,EAAI,CAEvC,IAAIkpC,EAAiBzB,EAAYlyD,GAAKwtD,GAEtC,IAAM,IAAItnB,EAAI,EAAGA,EAAIsc,EAAGla,QAAUpC,EAAI,CAErC,IAAM,IAAI0tB,EAAO,EAAGA,EAz+CP,EAy+C2BpR,EAAGh2C,OAASonD,EAEnD5L,EAAW2L,KAAsB3B,EAAW0B,EAAYE,EAAOpR,EAAGla,MAAQka,EAAGjvC,QAI9EmgD,IAIDlG,IAID,MAED,KAl/Ce,EAo/Cf,QACC,MAAM,IAAInlD,MAAO,qDAMpB,OAAO,IAAIkP,SAAUywC,EAAUr0C,QAIhC,SAAS89C,EAA2B99C,EAAQ5T,GAE3C,MAAM8zD,EAAa,IAAIhsD,WAAY8L,GACnC,IAAImgD,EAAY,EAEhB,KAAkD,GAA1CD,EAAY9zD,EAAOwC,MAAQuxD,IAElCA,GAAa,EAId,MAAMC,GAAc,IAAItsD,aAAcG,OACrCisD,EAAWn8C,MAAO3X,EAAOwC,MAAOxC,EAAOwC,MAAQuxD,IAKhD,OAFA/zD,EAAOwC,MAAQxC,EAAOwC,MAAQuxD,EAAY,EAEnCC,EAkCR,SAASC,EAAY3B,EAAUtyD,GAE9B,MAAMk0D,EAAQ5B,EAAS6B,SAAUn0D,EAAOwC,OAAO,GAI/C,OAFAxC,EAAOwC,MAAQxC,EAAOwC,MA9jDJ,EAgkDX0xD,EAIR,SAASpJ,EAAawH,EAAUtyD,GAE/B,MAAMo0D,EAAS9B,EAAS16C,UAAW5X,EAAOwC,OAAO,GAIjD,OAFAxC,EAAOwC,MAAQxC,EAAOwC,MAxkDJ,EA0kDX4xD,EAIR,SAAS7M,EAAiBF,EAAYrnD,GAErC,MAAMq0D,EAAQhN,EAAYrnD,EAAOwC,OAIjC,OAFAxC,EAAOwC,MAAQxC,EAAOwC,MAhlDL,EAklDV6xD,EAIR,SAAS5E,EAAY6C,EAAUtyD,GAE9B,MAAMq0D,EAAQ/B,EAAS1F,SAAU5sD,EAAOwC,OAIxC,OAFAxC,EAAOwC,MAAQxC,EAAOwC,MA1lDL,EA4lDV6xD,EAIR,MAAM1D,EAAa,SAAW2B,EAAUtyD,GAEvC,IAAIs0D,EAcJ,OAVCA,EAFI,gBAAiB98C,SAASP,UAExBs9C,OAAQjC,EAASkC,YAAax0D,EAAOwC,OAAO,IAI5C8vD,EAAS16C,UAAW5X,EAAOwC,MAAQ,GAAG,GAAS+xD,OAAQjC,EAAS16C,UAAW5X,EAAOwC,OAAO,IAAU,IAI1GxC,EAAOwC,OAlnDW,EAonDX8xD,GAIR,SAASG,EAAcnC,EAAUtyD,GAEhC,MAAMouD,EAAQkE,EAASoC,WAAY10D,EAAOwC,OAAO,GAIjD,OAFAxC,EAAOwC,OA3nDa,EA6nDb4rD,EAIR,SAASuG,EAAerC,EAAUtyD,GAEjC,OAAOkuD,UAAUC,YAAasG,EAAcnC,EAAUtyD,IAKvD,SAASszD,EAAesB,GAEvB,MAAMC,GAAsB,MAATD,IAAqB,GACvCE,EAAoB,KAATF,EAEZ,OAASA,GAAU,IAAO,EAAI,IAC7BC,EAEe,KAAbA,EACCC,EAAWl0B,IAAMxvB,EAAAA,EACjBlE,KAAK49B,IAAK,EAAG+pB,EAAW,KAAS,EAAIC,EAAW,MAE/BA,EAAW,KAA9B,gBAKH,SAASvF,EAAa+C,EAAUtyD,GAE/B,MAAM+0D,EAASzC,EAASkB,UAAWxzD,EAAOwC,OAAO,GAIjD,OAFAxC,EAAOwC,OA3pDW,EA6pDXuyD,EAIR,SAASC,EAAcphD,EAAQ5T,GAE9B,OAAOszD,EAAe/D,EAAa37C,EAAQ5T,IAyJ5C,SAASi1D,EAAY3C,EAAU1+C,EAAQ5T,EAAQyM,EAAM9L,GAEpD,MAAc,WAAT8L,GAA8B,iBAATA,GAAoC,eAATA,EAnStD,SAAiCmH,EAAQ5T,EAAQW,GAEhD,MAAMqzD,GAAc,IAAItsD,aAAcG,OACrC,IAAIC,WAAY8L,GAAS+D,MAAO3X,EAAOwC,MAAOxC,EAAOwC,MAAQ7B,IAK9D,OAFAX,EAAOwC,MAAQxC,EAAOwC,MAAQ7B,EAEvBqzD,EA6RCkB,CAAwBthD,EAAQ5T,EAAQW,GAE3B,WAAT8L,EA3Jb,SAAsB6lD,EAAU1+C,EAAQ5T,EAAQW,GAE/C,MAAMw0D,EAAcn1D,EAAOwC,MACrBitB,EAAW,GAEjB,KAAQzvB,EAAOwC,MAAU2yD,EAAcx0D,EAAO,GAAM,CAEnD,MAAMJ,EAAOmxD,EAA2B99C,EAAQ5T,GAC1CswD,EAAY2D,EAAY3B,EAAUtyD,GAClC6xD,EAAUpC,EAAY6C,EAAUtyD,GACtCA,EAAOwC,OAAS,EAChB,MAAM4yD,EAAYnB,EAAY3B,EAAUtyD,GAClCq1D,EAAYpB,EAAY3B,EAAUtyD,GAExCyvB,EAAS/uB,KAAM,CACdH,KAAMA,EACN+vD,UAAWA,EACXuB,QAASA,EACTuD,UAAWA,EACXC,UAAWA,IAOb,OAFAr1D,EAAOwC,OAAS,EAETitB,EAmIC6lC,CAAahD,EAAU1+C,EAAQ5T,EAAQW,GAE1B,mBAAT8L,EAjIb,SAA8B6lD,EAAUtyD,GAWvC,MAAO,CAAEu1D,KATId,EAAcnC,EAAUtyD,GAShBw1D,KARRf,EAAcnC,EAAUtyD,GAQJy1D,OAPlBhB,EAAcnC,EAAUtyD,GAOU01D,OANlCjB,EAAcnC,EAAUtyD,GAM0B21D,MALnDlB,EAAcnC,EAAUtyD,GAKyC41D,MAJjEnB,EAAcnC,EAAUtyD,GAIuD61D,OAH9EpB,EAAcnC,EAAUtyD,GAGsE81D,OAF9FrB,EAAcnC,EAAUtyD,IA0H/B+1D,CAAqBzD,EAAUtyD,GAElB,gBAATyM,EAtHb,SAA2B6lD,EAAUtyD,GAiBpC,MAfyB,CACxB,iBACA,kBACA,mBACA,kBACA,kBACA,oBACA,kBACA,mBACA,mBACA,oBAGmByvD,EAAY6C,EAAUtyD,IAyGlCg2D,CAAkB1D,EAAUtyD,GAEf,UAATyM,EArGb,SAAqB6lD,EAAUtyD,GAO9B,MAAO,CAAEi2D,KALIhC,EAAY3B,EAAUtyD,GAKdggD,KAJRiU,EAAY3B,EAAUtyD,GAIFk2D,KAHpBjC,EAAY3B,EAAUtyD,GAGU+/C,KAFhCkU,EAAY3B,EAAUtyD,IAkG3Bm2D,CAAY7D,EAAUtyD,GAET,WAATyM,EAhFb,SAAsB6lD,EAAUtyD,GAS/B,MAPgB,CACf,iBACA,eAGcyvD,EAAY6C,EAAUtyD,IA2E7Bo2D,CAAa9D,EAAUtyD,GAEV,aAATyM,EAvEb,SAAwB6lD,EAAUtyD,GAEjC,MAWMq2D,EAAQvL,EAAawH,EAAUtyD,GAC/Bs2D,EAAQxL,EAAawH,EAAUtyD,GAC/Bu2D,EAAQ9G,EAAY6C,EAAUtyD,GAEpC,MAAO,CACNq2D,MAAOA,EACPC,MAAOA,EACPE,UAlBkB,CAClB,YACA,gBACA,iBAe+B,GAARD,GACvBE,aAbqB,CACrB,aACA,YAW6BF,GAAS,IAoD/BG,CAAepE,EAAUtyD,GAEZ,cAATyM,EAtGb,SAAyB6lD,EAAUtyD,GAUlC,MARmB,CAClB,eACA,eACA,YAGiByvD,EAAY6C,EAAUtyD,IAgGhC22D,CAAgBrE,EAAUtyD,GAEb,UAATyM,EAEJgoD,EAAcnC,EAAUtyD,GAEX,QAATyM,EAzDb,SAAmB6lD,EAAUtyD,GAK5B,MAAO,CAHGy0D,EAAcnC,EAAUtyD,GACxBy0D,EAAcnC,EAAUtyD,IAwD1B42D,CAAUtE,EAAUtyD,GAEP,QAATyM,EApDb,SAAmB6lD,EAAUtyD,GAM5B,MAAO,CAJGy0D,EAAcnC,EAAUtyD,GACxBy0D,EAAcnC,EAAUtyD,GACxBy0D,EAAcnC,EAAUtyD,IAkD1B62D,CAAUvE,EAAUtyD,GAEP,QAATyM,EAEJwnD,EAAY3B,EAAUtyD,GAET,aAATyM,EAvUb,SAAwB6lD,EAAUtyD,GAKjC,MAAO,CAHGi0D,EAAY3B,EAAUtyD,GACtB8qD,EAAawH,EAAUtyD,IAsUzB82D,CAAexE,EAAUtyD,GAEZ,aAATyM,EAlUb,SAAwB6lD,EAAUtyD,GAKjC,MAAO,CAHG8qD,EAAawH,EAAUtyD,GACvB8qD,EAAawH,EAAUtyD,IAiUzB+2D,CAAezE,EAAUtyD,GAEZ,YAATyM,GAEXzM,EAAOwC,OAAS7B,EACT,gBAIPX,EAAOwC,OAAS7B,GAqClB,SAASq2D,EAAgBp2D,EAAOq2D,EAAUt2D,EAAM81D,GAE/C,MAAMS,EAAQ,IAAI9oD,MAAOxN,GAEzB,IAAM,IAAIX,EAAI,EAAGA,EAAIW,EAAOX,IAAO,CAElC,MAAM23B,EAAM,GAAK33B,EACjB,IAAIiW,EAAM+gD,EAAWr/B,EAAM,EAEN,YAAhB6+B,GAA8BvgD,EAAI0hB,EAAIq/B,IAAW/gD,GAAK,GAE3D,MAAM5T,EAAI4K,KAAKmmB,IAAKnd,EAAG,GAEvBghD,EAAOj3D,IAAUqC,EAAI3B,EAAO,GAAMA,EAAS,EAI5C,OAAOu2D,EAIR,SAASC,IAER,MAAMC,EAAarzD,KACb/D,EAASo3D,EAAWp3D,OACpB8vD,EAAY,CAAEttD,MAAO,GAE3B,IAAM,IAAI60D,EAAO,EAAGA,EAAOD,EAAWE,UAAWD,IAAU,CAE1D,MAAME,EAAQtD,EAAYmD,EAAW1I,OAAQ1uD,GACvCw3D,EAAQvD,EAAYmD,EAAW1I,OAAQ1uD,GAC7CA,EAAOwC,OAAS,EAChB40D,EAAWz2D,KAAOmqD,EAAasM,EAAW1I,OAAQ1uD,GAElD,MAAMy3D,EAASF,EAAQH,EAAWM,WAC5BC,EAASH,EAAQJ,EAAWQ,YAClCR,EAAWpI,QAAYyI,EAASL,EAAWM,WAAaN,EAAW7uB,MAAU6uB,EAAW7uB,MAAQkvB,EAASL,EAAWM,WACpHN,EAAWnI,MAAU0I,EAASP,EAAWQ,YAAcR,EAAW5jD,OAAW4jD,EAAW5jD,OAASmkD,EAASP,EAAWQ,YAErH,MAAMC,EAAiBT,EAAWpI,QAAUoI,EAAWlH,WAEjDxB,EADe0I,EAAWz2D,KAAOy2D,EAAWnI,MAAQ4I,EAC5BT,EAAWU,WAAYV,GAAe9I,EAAe8I,GAEnFp3D,EAAOwC,OAAS40D,EAAWz2D,KAE3B,IAAM,IAAIo3D,EAAO,EAAGA,EAAOX,EAAWnI,MAAO8I,IAAU,CAEtD,MAAMC,EAAaD,EAAOX,EAAWpI,QAAUoI,EAAWlH,WAE1D,IAAM,IAAI+H,EAAY,EAAGA,EAAYb,EAAWlI,cAAchvD,OAAQ+3D,IAAe,CAEpF,MAAM13D,EAAO+wD,EAAU7hC,SAAUwoC,GAAY13D,KACvC23D,EAAOd,EAAWe,mBAAoB53D,GAAS62D,EAAWpI,QAC1DoJ,EAAOhB,EAAWiB,eAAgB93D,GAExC,QAAcE,IAAT23D,EAAqB,SAE1BtI,EAAUttD,MAAQw1D,EAAaE,EAC/B,MAAMI,GAAkBlB,EAAW5jD,QAAW,EAAImkD,EAASI,IAAWX,EAAWmB,aAEjF,IAAM,IAAIpyB,EAAI,EAAGA,EAAIixB,EAAWpI,QAAS7oB,IAAO,CAE/C,MAAMqyB,EAAWF,GAAkBnyB,EAAIsxB,GAAWL,EAAWqB,eAAiBL,EAC9EhB,EAAWsB,UAAWF,GAAapB,EAAW50B,OAAQksB,EAAQoB,OAYnE,SAAS6I,IAER,MAAMvB,EAAarzD,KACb/D,EAASo3D,EAAWp3D,OACpB8vD,EAAY,CAAEttD,MAAO,GAE3B,IAAM,IAAIo2D,EAAmB,EAAGA,EAAmBxB,EAAW5jD,OAAS4jD,EAAWQ,YAAagB,IAAsB,CAEpH,MAAMb,EAAO9D,EAAYmD,EAAW1I,OAAQ1uD,GAAWsxD,EAAUuH,WAAW7Y,KAC5EoX,EAAWz2D,KAAOmqD,EAAasM,EAAW1I,OAAQ1uD,GAClDo3D,EAAWnI,MAAY8I,EAAOX,EAAWQ,YAAcR,EAAW5jD,OAAa4jD,EAAW5jD,OAASukD,EAASX,EAAWQ,YAEvH,MAAMkB,EAAe1B,EAAWpI,QAAUoI,EAAWlH,WAE/CxB,EADe0I,EAAWz2D,KAAOy2D,EAAWnI,MAAQ6J,EAC5B1B,EAAWU,WAAYV,GAAe9I,EAAe8I,GAEnFp3D,EAAOwC,OAAS40D,EAAWz2D,KAE3B,IAAM,IAAIo4D,EAAS,EAAGA,EAAS3B,EAAWQ,YAAamB,IAAY,CAElE,MAAMC,EAASJ,EAAmBxB,EAAWQ,YACvCqB,EAASF,EAAS3B,EAAW8B,UAAWF,GAC9C,GAAKC,GAAU7B,EAAW5jD,OAAS,SAEnC,MAAMwkD,EAAae,EAASD,EACtBR,GAAkBlB,EAAW5jD,OAAS,EAAIylD,GAAW7B,EAAWmB,aAEtE,IAAM,IAAIN,EAAY,EAAGA,EAAYb,EAAWlI,cAAchvD,OAAQ+3D,IAAe,CAEpF,MAAM13D,EAAO+wD,EAAU7hC,SAAUwoC,GAAY13D,KACvC23D,EAAOd,EAAWe,mBAAoB53D,GAAS62D,EAAWpI,QAC1DoJ,EAAOhB,EAAWiB,eAAgB93D,GAExC,QAAcE,IAAT23D,EAAL,CAEAtI,EAAUttD,MAAQw1D,EAAaE,EAE/B,IAAM,IAAI/xB,EAAI,EAAGA,EAAIixB,EAAWpI,QAAS7oB,IAAO,CAE/C,MAAMqyB,EAAWF,EAAgBnyB,EAAIixB,EAAWqB,eAAiBL,EACjEhB,EAAWsB,UAAWF,GAAapB,EAAW50B,OAAQksB,EAAQoB,QAkUnE,MAAM9vD,EAAS,CAAEwC,MAAO,GAClB22D,EAAiB,IAAI3hD,SAAU5D,GAC/ByzC,EAAa,IAAIv/C,WAAY8L,GAG7B09C,EA3TN,SAAsBgB,EAAU1+C,EAAQ5T,GAEvC,MAAMsxD,EAAY,GAElB,GAAsC,UAAjCgB,EAAS16C,UAAW,GAAG,GAE3B,MAAM,IAAItP,MAAO,0EAIlBgpD,EAAUjpD,QAAUiqD,EAAS1F,SAAU,GAEvC,MAAMwM,EAAO9G,EAAS1F,SAAU,GAEhC0E,EAAU8H,KAAO,CAChBC,cAAwB,EAAPD,GACjBE,YAAsB,EAAPF,GACfG,cAAwB,EAAPH,GACjBI,aAAuB,GAAPJ,IAKjBp5D,EAAOwC,MAAQ,EAEf,IAAIi3D,GAAc,EAElB,KAAQA,GAAc,CAErB,MAAM7iD,EAAgB86C,EAA2B99C,EAAQ5T,GAEzD,GAAsB,GAAjB4W,EAEJ6iD,GAAc,MAER,CAEN,MAAMpgC,EAAgBq4B,EAA2B99C,EAAQ5T,GAEnD05D,EAAiBzE,EAAY3C,EAAU1+C,EAAQ5T,EAAQq5B,EADvCyxB,EAAawH,EAAUtyD,SAGrBS,IAAnBi5D,EAEJr5D,QAAQ0C,KAAM,2DAA4Ds2B,OAI1Ei4B,EAAW16C,GAAkB8iD,GAQhC,GAA0B,KAAZ,EAAPN,GAGN,MADA/4D,QAAQC,MAAO,mBAAoBgxD,GAC7B,IAAIhpD,MAAO,4DAIlB,OAAOgpD,EA6PUqI,CAAaR,EAAgBvlD,EAAQ5T,GAGjDo3D,EA5PN,SAAuB9F,EAAWgB,EAAUjL,EAAYrnD,EAAQ45D,GAE/D,MAAMxC,EAAa,CAClBz2D,KAAM,EACN+tD,OAAQ4D,EACRtwD,MAAOqlD,EACPrnD,OAAQA,EACRuoC,MAAO+oB,EAAUuH,WAAW3C,KAAO5E,EAAUuH,WAAW5C,KAAO,EAC/DziD,OAAQ89C,EAAUuH,WAAW9Y,KAAOuR,EAAUuH,WAAW7Y,KAAO,EAChEkP,cAAeoC,EAAU7hC,SACzB0oC,mBAAoB,GACpBe,UAAW,KACXhJ,WAAY,KACZlB,QAAS,KACTC,MAAO,KACPxiD,KAAM,KACNqrD,WAAY,KACZt1B,OAAQ,KACRq3B,OAAQ,KACRxwC,WAAY9c,sBAGb,OAAS+kD,EAAUC,aAElB,IAAK,iBACJ6F,EAAWQ,YAAc,EACzBR,EAAWU,WAAaxJ,EACxB,MAED,IAAK,kBACJ8I,EAAWQ,YAAc,EACzBR,EAAWU,WAAatJ,EACxB,MAED,IAAK,mBACJ4I,EAAWQ,YAAc,EACzBR,EAAWU,WAAajJ,EACxB,MAED,IAAK,kBACJuI,EAAWQ,YAAc,GACzBR,EAAWU,WAAajJ,EACxB,MAED,IAAK,kBACJuI,EAAWQ,YAAc,GACzBR,EAAWU,WAAa/I,EACxB,MAED,IAAK,oBACJqI,EAAWQ,YAAc,GACzBR,EAAWU,WAAa9H,EACxB,MAED,IAAK,mBACJoH,EAAWQ,YAAc,GACzBR,EAAWU,WAAarH,EACxB,MAED,IAAK,mBACJ2G,EAAWQ,YAAc,IACzBR,EAAWU,WAAarH,EACxB,MAED,QACC,MAAM,IAAInoD,MAAO,oBAAsBgpD,EAAUC,YAAc,mBAIjE,MAAM9hC,EAAW,GACjB,IAAM,MAAMrW,KAAWk4C,EAAU7hC,SAEhC,OAASrW,EAAQ7Y,MAEhB,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACJkvB,EAAUrW,EAAQ7Y,OAAS,EAC3B62D,EAAW3qD,KAAO2M,EAAQk3C,UAO7B,IAAIwJ,GAAY,EAEhB,GAAKrqC,EAASsqC,GAAKtqC,EAASuqC,GAAKvqC,EAASwqC,EAEzCH,GAAcrqC,EAASyqC,EACvB9C,EAAWqB,eAAiB,EAC5BrB,EAAWiB,eAAiB,CAAE0B,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,OAE7C,CAAA,IAAKzqC,EAAS0qC,EAOpB,MAAM,IAAI7xD,MAAO,6DALjB8uD,EAAWqB,eAAiB,EAC5BrB,EAAWiB,eAAiB,CAAE8B,EAAG,GAQlC,GAAwB,GAAnB/C,EAAW3qD,KAGf,OAASmtD,GAER,KAAKQ,UACJhD,EAAW50B,OAASwyB,EACpB,MAED,KAAKjO,cACJqQ,EAAW50B,OAAS+sB,MAKhB,CAAA,GAAwB,GAAnB6H,EAAW3qD,KAgBtB,MAAM,IAAInE,MAAO,0CAA4C8uD,EAAW3qD,KAAO,QAAU6kD,EAAUC,YAAc,KAbjH,OAASqI,GAER,KAAKQ,UACJhD,EAAW50B,OAASiyB,EACpB,MAED,KAAK1N,cACJqQ,EAAW50B,OAASmyB,GAUvByC,EAAWpI,QAAUoI,EAAW7uB,MAChC,MAAM5nC,EAAOy2D,EAAW7uB,MAAQ6uB,EAAW5jD,OAAS4jD,EAAWqB,eAE/D,OAASmB,GAER,KAAKQ,UACJhD,EAAWsB,UAAY,IAAIx7C,aAAcvc,GAGpCm5D,GACJ1C,EAAWsB,UAAUrF,KAAM,EAAG,EAAG1yD,GAElC,MAED,KAAKomD,cACJqQ,EAAWsB,UAAY,IAAI57C,YAAanc,GAEnCm5D,GACJ1C,EAAWsB,UAAUrF,KAAM,MAAQ,EAAG1yD,GAEvC,MAED,QACCN,QAAQC,MAAO,sCAAuCs5D,GAKxD,IAAI3lD,EAAa,EACjB,IAAM,MAAMmF,KAAWk4C,EAAU7hC,cAEmBhvB,IAA9C22D,EAAWiB,eAAgBj/C,EAAQ7Y,QAEvC62D,EAAWe,mBAAoB/+C,EAAQ7Y,MAAS0T,GAIjDA,GAAkC,EAApBmF,EAAQk3C,UA6BvB,GAzBA8G,EAAWlH,WAAaj8C,EACxBmjD,EAAWmB,aAAenB,EAAW7uB,MAAQ6uB,EAAWqB,eAE3B,iBAAxBnH,EAAU+I,UAEdjD,EAAW8B,UAAcxuC,GAAOA,EAIhC0sC,EAAW8B,UAAcxuC,GAAO0sC,EAAW5jD,OAAS,EAAIkX,EAIvB,GAA7B0sC,EAAWqB,gBAEfrB,EAAWyC,OAASS,WACpBlD,EAAW/tC,WAAa9c,uBAIxB6qD,EAAWyC,OAASU,UACpBnD,EAAW/tC,WAAamxC,cAIpBlJ,EAAU8H,KAAKC,WAAa,CAEhCjC,EAAWQ,YAActG,EAAU4F,MAAMZ,MACzCc,EAAWM,WAAapG,EAAU4F,MAAMb,MAExC,MAAMoE,EA5aR,SAA8BC,EAAUrhB,EAAG9c,GAE1C,IAAIo+B,EAAM,EAEV,OAASD,EAASlE,WAEjB,IAAK,YACJmE,EAAM,EACN,MAED,IAAK,gBACJA,EAlBH,SAAoBx0B,EAAG7xB,GAEtB,MAAMsmD,EAAO1tD,KAAK0tD,KAAMz0B,GACxB,MAAe,cAAR7xB,EAAuBpH,KAAKuZ,MAAOm0C,GAAS1tD,KAAKulD,KAAMmI,GAetDC,CAAW3tD,KAAKmmB,IAAKgmB,EAAG9c,GAAKm+B,EAASjE,cAAiB,EAC7D,MAED,IAAK,gBACJ,MAAM,IAAInuD,MAAO,+DAInB,OAAOqyD,EAyZaG,CAAqBxJ,EAAU4F,MAAOE,EAAW7uB,MAAO6uB,EAAW5jD,QAGhFunD,EAAY/D,EAAgByD,EAAYrD,EAAW7uB,MAAO+oB,EAAU4F,MAAMb,MAAO/E,EAAU4F,MAAMT,cACjGuE,EAAYhE,EAAgByD,EAAYrD,EAAW5jD,OAAQ89C,EAAU4F,MAAMZ,MAAOhF,EAAU4F,MAAMT,cAExGW,EAAWE,UAAYyD,EAAW,GAAMC,EAAW,GAEnD,IAAM,IAAI14D,EAAI,EAAGA,EAAIm4D,EAAYn4D,IAChC,IAAM,IAAIooB,EAAI,EAAGA,EAAIswC,EAAW14D,GAAKooB,IACpC,IAAM,IAAIyb,EAAI,EAAGA,EAAI40B,EAAWz4D,GAAK6jC,IACpCwqB,EAAY2B,EAAUtyD,GAEzBo3D,EAAWvvD,OAASsvD,EAAWnmC,KAAMomC,OAE/B,CAENA,EAAWM,WAAaN,EAAW7uB,MACnC,MAAM0yB,EAAa/tD,KAAKulD,KAAM2E,EAAW5jD,OAAS4jD,EAAWQ,aAE7D,IAAM,IAAI33D,EAAI,EAAGA,EAAIg7D,EAAYh7D,IAChC0wD,EAAY2B,EAAUtyD,GAEvBo3D,EAAWvvD,OAAS8wD,EAAc3nC,KAAMomC,GAIzC,OAAOA,EAaW8D,CAAc5J,EAAW6H,EAAgB9R,EAAYrnD,EAAQ+D,KAAK0I,MAKrF,OAFA2qD,EAAWvvD,SAEJ,CACN4P,OAAQ65C,EACR/oB,MAAO6uB,EAAW7uB,MAClB/0B,OAAQ4jD,EAAW5jD,OACnBxM,KAAMowD,EAAWsB,UACjBmB,OAAQzC,EAAWyC,OACnBxwC,WAAY+tC,EAAW/tC,WACvB5c,KAAM1I,KAAK0I,MAKb7I,YAAapB,GAGZ,OADAuB,KAAK0I,KAAOjK,EACLuB,KAIRH,KAAM2B,EAAKC,EAAQC,EAAYC,GAc9B,OAAO5B,MAAMiD,KAAMxB,GAZnB,SAAyB0T,EAASkiD,GAEjCliD,EAAQoQ,WAAa8xC,EAAQ9xC,WAC7BpQ,EAAQgP,UAAY1K,aACpBtE,EAAQ+O,UAAYzK,aACpBtE,EAAQmP,iBAAkB,EAC1BnP,EAAQ4O,OAAQ,EAEXriB,GAASA,EAAQyT,EAASkiD,KAIQ11D,EAAYC,ICh/EtD,MAAM01D,mBAAmBtU,kBAExBljD,YAAaC,GAEZC,MAAOD,GAEPE,KAAK0I,KAAOs6C,cAMbnjD,MAAOgQ,GAEN,MAMCynD,EAAa,SAAWC,EAAiB5X,GAExC,OAAS4X,GAER,KARgB,EAQM,MAAM,IAAIhzD,MAAO,kCAAqCo7C,GAAO,KACnF,KARiB,EAQM,MAAM,IAAIp7C,MAAO,mCAAsCo7C,GAAO,KACrF,KARkB,EAQM,MAAM,IAAIp7C,MAAO,uCAA0Co7C,GAAO,KAC1F,QACA,KATkB,EASM,MAAM,IAAIp7C,MAAO,oCAAuCo7C,GAAO,OAqBzF6X,EAAQ,SAAW3nD,EAAQ4nD,EAAWC,GAIrCD,EAAcA,GAAY,KAC1B,IAAI1lD,EAAIlC,EAAOixC,IACd5kD,GAAM,EAAGirD,EAAM,EAAGh1C,EAAI,GACtBwlD,EAAQC,OAAOC,aAAan+B,MAAO,KAAM,IAAI3gB,YAAalJ,EAAOyxC,SAAUvvC,EAAGA,EAL7D,OAOlB,KAAU,GAAM7V,EAAIy7D,EAAMt0D,QAXjB,QAW6C8jD,EAAMsQ,GAAiB1lD,EAAIlC,EAAOM,YAEvFgC,GAAKwlD,EAAOxQ,GAAOwQ,EAAMx7D,OACzB4V,GAViB,IAWjB4lD,GAASC,OAAOC,aAAan+B,MAAO,KAAM,IAAI3gB,YAAalJ,EAAOyxC,SAAUvvC,EAAGA,EAX9D,OAelB,OAAO,EAAI7V,KAQL,IAAUw7D,IAAU7nD,EAAOixC,KAAOqG,EAAMjrD,EAAI,GAC1CiW,EAAIwlD,EAAM/jD,MAAO,EAAG1X,KA+OxB47D,EAAqB,SAAWC,EAAaC,EAAcC,EAAWC,GAE3E,MAAM71D,EAAI01D,EAAaC,EAAe,GAChCvsD,EAAQtC,KAAK49B,IAAK,EAAK1kC,EAAI,KAAU,IAE3C41D,EAAWC,EAAa,GAAMH,EAAaC,EAAe,GAAMvsD,EAChEwsD,EAAWC,EAAa,GAAMH,EAAaC,EAAe,GAAMvsD,EAChEwsD,EAAWC,EAAa,GAAMH,EAAaC,EAAe,GAAMvsD,EAChEwsD,EAAWC,EAAa,GAAM,GAIzBC,EAAoB,SAAWJ,EAAaC,EAAcC,EAAWC,GAE1E,MAAM71D,EAAI01D,EAAaC,EAAe,GAChCvsD,EAAQtC,KAAK49B,IAAK,EAAK1kC,EAAI,KAAU,IAG3C41D,EAAWC,EAAa,GAAM/N,UAAUC,YAAajhD,KAAKkmB,IAAK0oC,EAAaC,EAAe,GAAMvsD,EAAO,QACxGwsD,EAAWC,EAAa,GAAM/N,UAAUC,YAAajhD,KAAKkmB,IAAK0oC,EAAaC,EAAe,GAAMvsD,EAAO,QACxGwsD,EAAWC,EAAa,GAAM/N,UAAUC,YAAajhD,KAAKkmB,IAAK0oC,EAAaC,EAAe,GAAMvsD,EAAO,QACxGwsD,EAAWC,EAAa,GAAM/N,UAAUC,YAAa,IAIhDuK,EAAY,IAAI5wD,WAAY8L,GAClC8kD,EAAU7T,IAAM,EAChB,MAAMsX,EAjQa,SAAWvoD,GAI5B,MACCwoD,EAAW,oCACXC,EAAc,uCACdC,EAAY,uBACZC,EAAgB,oCAGhB9kD,EAAS,CAER+kD,MAAO,EAEPC,OAAQ,GAERC,SAAU,GAEVC,YAAa,OAEb9C,OAAQ,GAERrM,MAAO,EAEPoP,SAAU,EAEVr0B,MAAO,EAAG/0B,OAAQ,GAIpB,IAAIukD,EAAMr1C,EAmBV,KAjBK9O,EAAOixC,KAAOjxC,EAAOM,cAAkB6jD,EAAOwD,EAAO3nD,MAEzDynD,EAvGgB,EAuGa,oBAKrB34C,EAAQq1C,EAAKr1C,MApCC,eAsCtB24C,EA5GkB,EA4Ga,qBAIhC5jD,EAAO+kD,OAvFiB,EAwFxB/kD,EAAOklD,YAAcj6C,EAAO,GAC5BjL,EAAOglD,QAAU1E,EAAO,KAIvBA,EAAOwD,EAAO3nD,IACT,IAAUmkD,GAGf,GAFAtgD,EAAOglD,QAAU1E,EAAO,KAEnB,MAAQA,EAAK8E,OAAQ,IAkC1B,IA3BKn6C,EAAQq1C,EAAKr1C,MAAO05C,MAExB3kD,EAAO+1C,MAAQhuB,WAAY9c,EAAO,MAI9BA,EAAQq1C,EAAKr1C,MAAO25C,MAExB5kD,EAAOmlD,SAAWp9B,WAAY9c,EAAO,MAIjCA,EAAQq1C,EAAKr1C,MAAO45C,MAExB7kD,EAAO+kD,OArHU,EAsHjB/kD,EAAOoiD,OAASn3C,EAAO,KAInBA,EAAQq1C,EAAKr1C,MAAO65C,MAExB9kD,EAAO+kD,OA3Hc,EA4HrB/kD,EAAOjE,OAASmP,SAAUD,EAAO,GAAK,IACtCjL,EAAO8wB,MAAQ5lB,SAAUD,EAAO,GAAK,KA9HpB,EAkIXjL,EAAO+kD,OAjIQ,EAiIyB/kD,EAAO+kD,MAAkC,WAhCvF/kD,EAAOilD,UAAY3E,EAAO,KAgD5B,OAlJmB,EAsIVtgD,EAAO+kD,OAEfnB,EAlKkB,EAkKa,4BAvIT,EA2Id5jD,EAAO+kD,OAEfnB,EAxKkB,EAwKa,gCAIzB5jD,EAuJgBqlD,CAAiBpE,GAEpCrf,EAAI8iB,EAAiB5zB,MAC1BhM,EAAI4/B,EAAiB3oD,OACrBupD,EAvJsB,SAAWnpD,EAAQylC,EAAG9c,GAE3C,MAAMygC,EAAiB3jB,EAEvB,GAEK2jB,EAAiB,GAASA,EAAiB,OAE3C,IAAMppD,EAAQ,IAAW,IAAMA,EAAQ,IAAyB,IAAdA,EAAQ,GAI9D,OAAO,IAAI9L,WAAY8L,GAInBopD,KAAuBppD,EAAQ,IAAO,EAAMA,EAAQ,KAExDynD,EAlMkB,EAkMa,wBAIhC,MAAM4B,EAAY,IAAIn1D,WAAY,EAAIuxC,EAAI9c,GAEnC0gC,EAAU/8D,QAEhBm7D,EAzMkB,EAyMa,mCAIhC,IAAIr7D,EAAS,EAAG6kD,EAAM,EAEtB,MAAMqY,EAAU,EAAIF,EACdG,EAAY,IAAIr1D,WAAY,GAC5Bs1D,EAAkB,IAAIt1D,WAAYo1D,GACxC,IAAIG,EAAgB9gC,EAGpB,KAAU8gC,EAAgB,GAASxY,EAAMjxC,EAAOM,YAAe,CAEzD2wC,EAAM,EAAIjxC,EAAOM,YAErBmnD,EA5Ne,GAgOhB8B,EAAW,GAAMvpD,EAAQixC,KACzBsY,EAAW,GAAMvpD,EAAQixC,KACzBsY,EAAW,GAAMvpD,EAAQixC,KACzBsY,EAAW,GAAMvpD,EAAQixC,KAElB,GAAKsY,EAAW,IAAW,GAAKA,EAAW,KAAeA,EAAW,IAAO,EAAMA,EAAW,KAASH,GAE5G3B,EArOiB,EAqOc,4BAMhC,IAAaz6D,EAATw5B,EAAM,EAEV,KAAUA,EAAM8iC,GAAerY,EAAMjxC,EAAOM,YAAe,CAE1DtT,EAAQgT,EAAQixC,KAChB,MAAMyY,EAAe18D,EAAQ,IAS7B,GARK08D,IAAe18D,GAAS,MAEtB,IAAMA,GAAaw5B,EAAMx5B,EAAQs8D,IAEvC7B,EArPgB,EAqPe,qBAI3BiC,EAAe,CAGnB,MAAMC,EAAY3pD,EAAQixC,KAC1B,IAAM,IAAI5kD,EAAI,EAAGA,EAAIW,EAAOX,IAE3Bm9D,EAAiBhjC,KAAWmjC,OAQ7BH,EAAgBz6D,IAAKiR,EAAOyxC,SAAUR,EAAKA,EAAMjkD,GAASw5B,GAC1DA,GAAOx5B,EAAOikD,GAAOjkD,EASvB,MAAM0B,EAAI06D,EACV,IAAM,IAAI/8D,EAAI,EAAGA,EAAIqC,EAAGrC,IAAO,CAE9B,IAAIu9D,EAAM,EACVP,EAAWj9D,GAAWo9D,EAAiBn9D,EAAIu9D,GAC3CA,GAAOR,EACPC,EAAWj9D,EAAS,GAAMo9D,EAAiBn9D,EAAIu9D,GAC/CA,GAAOR,EACPC,EAAWj9D,EAAS,GAAMo9D,EAAiBn9D,EAAIu9D,GAC/CA,GAAOR,EACPC,EAAWj9D,EAAS,GAAMo9D,EAAiBn9D,EAAIu9D,GAC/Cx9D,GAAU,EAIXq9D,IAID,OAAOJ,EAmCUQ,CAAqB/E,EAAUrT,SAAUqT,EAAU7T,KAAOxL,EAAG9c,GAGhF,IAAIv1B,EAAMyF,EACNixD,EAEJ,OAAS35D,KAAK0I,MAEb,KAAK2tD,UAEJsD,EAAcX,EAAgB78D,OAAS,EACvC,MAAMy9D,EAAa,IAAIzgD,aAA4B,EAAdwgD,GAErC,IAAM,IAAIz8D,EAAI,EAAGA,EAAIy8D,EAAaz8D,IAEjC46D,EAAoBkB,EAAqB,EAAJ97D,EAAO08D,EAAgB,EAAJ18D,GAIzD+F,EAAO22D,EACPlxD,EAAO2tD,UACP,MAED,KAAKrT,cAEJ2W,EAAcX,EAAgB78D,OAAS,EACvC,MAAM09D,EAAY,IAAI9gD,YAA2B,EAAd4gD,GAEnC,IAAM,IAAIz8D,EAAI,EAAGA,EAAIy8D,EAAaz8D,IAEjCi7D,EAAmBa,EAAqB,EAAJ97D,EAAO28D,EAAe,EAAJ38D,GAIvD+F,EAAO42D,EACPnxD,EAAOs6C,cACP,MAED,QAEC,MAAM,IAAIz+C,MAAO,uCAAyCvE,KAAK0I,MAKjE,MAAO,CACN87B,MAAO8Q,EAAG7lC,OAAQ+oB,EAClBv1B,KAAMA,EACNyQ,OAAQ0kD,EAAiBM,OACzBjP,MAAO2O,EAAiB3O,MACxBoP,SAAUT,EAAiBS,SAC3BnwD,KAAMA,GAKR7I,YAAapB,GAGZ,OADAuB,KAAK0I,KAAOjK,EACLuB,KAIRH,KAAM2B,EAAKC,EAAQC,EAAYC,GAuB9B,OAAO5B,MAAMiD,KAAMxB,GArBnB,SAAyB0T,EAASkiD,GAEjC,OAASliD,EAAQxM,MAEhB,KAAK2tD,UACL,KAAKrT,cAEJ9tC,EAAQoQ,WAAa9c,qBACrB0M,EAAQgP,UAAY1K,aACpBtE,EAAQ+O,UAAYzK,aACpBtE,EAAQmP,iBAAkB,EAC1BnP,EAAQ4O,OAAQ,EAMbriB,GAASA,EAAQyT,EAASkiD,KAIQ11D,EAAYC,8rCbpbtD,MAEC9B,cAECG,KAAK85D,QAAS,EAGd95D,KAAK+5D,SAAU,EAGf/5D,KAAKg6D,WAAY,EAGjBh6D,KAAKsT,OAAQ,EAGbtT,KAAKi6D,gBAAiB,EAIvBp6D,WAEAA,SAECvD,QAAQC,MAAO,8DAIhBsD,kpwDcrBD,MAAMq6D,4BAA4B3wC,KAEjC1pB,YAAagI,EAAOQ,GAEnB,MAEMjM,EAAW,IAAIJ,eACrBI,EAASmB,aAAc,WAAY,IAAIy5C,uBAHrB,CAAE,EAAG,EAAG,GAAK,EAAG,EAAG,GAAK,GAAK,EAAG,EAAG,GAAK,EAAG,EAAG,EAAG,EAAG,GAGI,IAC1E56C,EAAS+9D,wBAITp6D,MAAO3D,EAFU,IAAIkqB,kBAAmB,CAAE8zC,KAAK,KAI/Cp6D,KAAK6H,MAAQA,EACb7H,KAAKqI,MAAQA,EACbrI,KAAK0I,KAAO,sBAIZ,MAEM2xD,EAAY,IAAIr+D,eACtBq+D,EAAU98D,aAAc,WAAY,IAAIy5C,uBAHrB,CAAE,EAAG,EAAG,GAAK,EAAG,EAAG,GAAK,GAAK,EAAG,EAAG,EAAG,EAAG,GAAK,GAAK,EAAG,EAAG,GAAK,EAAG,GAGR,IAC5EqjB,EAAUF,wBAEVn6D,KAAKgG,IAAK,IAAIojB,KAAMixC,EAAW,IAAIvwD,kBAAmB,CAAE0d,KAAM8yC,SAAUF,KAAK,MAI9Ev6D,oBAIC,GAFAG,KAAKyL,MAAM7M,IAAK,GAAMoB,KAAK6H,MAAM28B,MAAO,GAAMxkC,KAAK6H,MAAM4H,OAAQ,QAE7C/S,IAAfsD,KAAKqI,MAETrI,KAAKsS,SAASjK,MAAMzJ,IAAKoB,KAAKqI,OAC9BrI,KAAK2R,SAAU,GAAIW,SAASjK,MAAMzJ,IAAKoB,KAAKqI,WAEtC,CAENrI,KAAKsS,SAASjK,MAAM8K,KAAMnT,KAAK6H,MAAMQ,OAAQmnB,eAAgBxvB,KAAK6H,MAAM2B,WAGxE,MAAMhL,EAAIwB,KAAKsS,SAASjK,MAClBinB,EAAMnmB,KAAKmmB,IAAK9wB,EAAEm1B,EAAGn1B,EAAEo1B,EAAGp1B,EAAEq1B,GAC7BvE,EAAM,GAAI9wB,EAAEgxB,eAAgB,EAAIF,GAErCtvB,KAAK2R,SAAU,GAAIW,SAASjK,MAAM8K,KAAMnT,KAAKsS,SAASjK,OAKvDrI,KAAKu6D,YAAYC,gBAAiBx6D,KAAK6H,MAAM0yD,aAAc9uD,MAAOzL,KAAKyL,OAAQgvD,aAAcz6D,KAAK6H,MAAM0yD,aAExGv6D,KAAK2R,SAAU,GAAI4oD,YAAYpnD,KAAMnT,KAAKu6D,aAI3C16D,UAECG,KAAK5D,SAAS+6C,UACdn3C,KAAKsS,SAAS6kC,UACdn3C,KAAK2R,SAAU,GAAIvV,SAAS+6C,UAC5Bn3C,KAAK2R,SAAU,GAAIW,SAAS6kC,gixBC1E9B,MAAMujB,WAAa,CAElBl+D,KAAM,aAENm+D,SAAU,CAETC,SAAY,CAAEn8D,MAAO,MACrByL,QAAW,CAAEzL,MAAO,IAIrBo8D,aAAwB,8JAWxBC,eAA0B,uNCtBrBC,WAAa,CAElBv+D,KAAM,aAENm+D,SAAU,CAETC,SAAY,CAAEn8D,MAAO,MACrBq9C,WAAc,CAAEr9C,MAAO,IAAIkN,QAAS,EAAI,KAAM,EAAI,OAInDkvD,aAAwB,8JAWxBC,eAA0B"}
|